算法3D轨道摄像机控制带有鼠标拖动



请帮助,

我找不到有关此的详细说明,而不是语言,而不是依赖库,因为我想自己自己控制数学。

如何使用鼠标创建轨道摄像机控件,例如 Google Sketchup中的中点击拖动

*在Google Sketchup中,摄像机可以通过拖动鼠标来移动飞机中间的圆形旋转虚构对象(不是始终为0,0,0)。它可以水平,垂直,对角线,所有方向。

最简单的解决方案是存储x/y方向角度,最终是变焦级别。然后,您在某些Mousemove事件中修改角度,然后使用它们来计算相机方向。

这是一些用于鼠标拖动的伪代码:

OnMouseDown:
    mouseDragging = true;
    lastX = mouse.x;
    lastY = mouse.y;
OnMouseUp:
    mouseDragging = false;
OnMouseMove:
    if( mouseDragging ) {
        angleX += (mouse.x-lastX) * speedX;
        angleY += (mouse.y-lastY) * speedY;
    }
OnMouseWheel:
    zoom += mouse.wheelDelta;

给定这些数据,您可以构建相机位置。我不知道您对此正在使用什么,但这是OpenGL的一个示例:

glLoadIdentity();
glTranslatef( 0.0f, 0.0f, -zoom );
glRotatef( angleY, 1.0f, 0.0f, 0.0f );
glRotatef( angleX, 0.0f, 1.0f, 0.0f );
glTranslatef( -orbitCenterX, -orbitCenterY, -orbitCenterZ );

Google的术语为" arcball"。参见例如https://en.wikibooks.org/wiki/opengl_programming/modern_opengl_tutorial_arcball

,但总的来说,有许多细微的差异使互动更好。

我知道您的问题是2 1/2年前,但是对于此事的任何人,Helix Toolkit可能都有您需要的东西。我也一直在寻找Sketchup行为,直到最近才在这个项目中找到它。它是.NET,但可以使用源代码,因此应该对您想要的内容提供一些见解。

轨道是由用户按下在其控制中完成的,并按住鼠标按钮,然后将鼠标移动到周围,fyi。并且控件中有一个属性可以确定您是否希望该行为绕模型中心或Currrent鼠标位置绕绕,因此我发现如果需要,它与Sketchup的行为相同。

您可以看一下gluLookAt()-网络上的许多图像显示相机向量,并提供说明。基本上,相机具有位置,查看向量和向量。至于操纵,最常见的方法通常涉及四个数学。也有许多详细的教程。最后一块将涉及将2D屏幕鼠标移动映射到3D摄像机命令。一旦您拥有相机数学工作,该部分应该直接向前。希望会有所帮助。

最新更新