算法3d轨道摄像机控制鼠标拖动

时间:2014-02-06 12:46:44

标签: 3d geometry game-physics pseudocode

请帮忙,

我找不到关于此的详细解释,这不是特定于语言而且不依赖于库,因为我想出于某种原因自己控制数学。

如何使用鼠标创建轨道摄像机控制,例如在 Google SketchUp 中单击鼠标拖动?

*在Google SketchUp中,通过拖动鼠标,相机可以在平面中间(始终为0,0,0)的圆形轨道运动。它可以水平,垂直,甚至对角地沿所有方向运行。

4 个答案:

答案 0 :(得分:5)

最简单的解决方案是存储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 );

答案 1 :(得分:2)

谷歌的术语是" arcball"。请参阅示例https://en.wikibooks.org/wiki/OpenGL_Programming/Modern_OpenGL_Tutorial_Arcball

但总的来说,存在许多微妙的差异,这使得互动变得更好。

答案 2 :(得分:0)

您可以查看gluLookAt() - 网上显示相机矢量的许多图片,并附上说明。基本上相机有一个位置,一个矢量和一个向上的矢量。就操纵而言,最常见的方式通常涉及四元数学。关于它的大量详细教程。最后一部分将涉及将2D屏幕鼠标移动映射到3D相机命令。一旦你的相机数学工作,这部分应该是直截了当的。希望有所帮助。

答案 3 :(得分:0)

我知道你的问题是在2年半前,但对于任何发生在这个问题上的人the helix toolkit可能有你所需要的。我也在寻找Sketchup行为,并且最近才在这个项目中找到它。它是.NET,但是源代码可用,所以它应该提供一些你正在寻找的东西。

用户按下并按住右侧鼠标按钮,然后移动鼠标,即可进行轨道运行。并且控件中有一个属性可以确定您是否希望行为围绕模型的中心或当前的鼠标位置进行轨道运行,因此我发现它与Sketchup的行为相同(如果需要)。