处理摄像机视锥和透视旋转。

3

在Processing 2+中,如何制作一个可以在世界空间中移动和旋转的摄像机?

我已经有一个摄像机,可以在世界空间中移动并具有某种旋转:

frustum(-10,10,-10,10,10,2000);
translate(camX,camY,camZ);//I move around by adding to these values when a button is pressed
rotate(angleX,1,0,0);//same here...
rotate(angleY,0,1,0);
rotate(angleZ,0,0,1);

这个问题的关键在于旋转是以场景为中心进行的,这意味着当远离场景中心坐标时,我会得到非常奇怪的旋转。为什么在旋转之前进行了平移,这种情况还会发生?

你是想学习3D中的运动和旋转原理,还是想为其他事情实现它?如果是为了实现,可以看看Processing中的PeasyCam。此外,为了学习,您可以查看他们的源代码。 - Nico
嗯,我想了解3D相机移动的基础知识。虽然从网上看到的内容,我并没有完全理解。 - Patrick Dahlin
我对于在三维空间中进行翻译和移动物体的理解在这个例子中并没有按预期工作,我真的很想知道为什么,以便更好地理解它。 - Patrick Dahlin
1
我直说吧,理解3D中的旋转和平移真是太难了。最近我创建了一个3D场景,但很遗憾我不能分享太多关于它的内容。不过,这个人的视频以及他提供的C++代码对我帮助很大:https://www.youtube.com/playlist?list=PLW3Zl3wyJwWOpdhYedlD-yCB7WQoHf-My - Nico
1个回答

3
感谢Nicolás Carlo的建议,他建议我观看由Jorge Rodriguez制作的此Youtube播放列表,使我能够修复我第一次几乎做对的错误。
我所要做的就是进行一些简单的三角计算,从我得到的角度中获取前向量,然后只需将相机位置添加到该向量中,作为camera()函数中的centerX,centerY和centerZ值。
例如,其中camPos是当前位置3D向量,而vecForward是我所需的计算出的3D前向量。
vecForward.x = cos(yaw)*cos(pitch);
vecForward.y = sin(pitch);
vecForward.z = sin(yaw)*cos(pitch);

camera(camPos.x,camPos.y,camPos.z, camPos.x+vecForward.x,camPos.y+vecForward.y,camPos.z+vecForward.z, 0,1,0);

如果你不知道,Pitch是相机的上下角度,Yaw是左右角度。
最后要注意的是,我强烈建议看看Rodriguez的“游戏开发数学”,这是Carlo建议的,因为每个视频都解释了至少一个最重要/经常使用的数学解决方案,以解决不同的问题,最后给出一个例子。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接