3d 基于鼠标拖动的三维动态摄像机控制算法

3d 基于鼠标拖动的三维动态摄像机控制算法,3d,geometry,game-physics,pseudocode,3d,Geometry,Game Physics,Pseudocode,请帮忙 我找不到关于这一点的详细解释,这不是特定于语言的,也不是依赖于库的,因为出于某种原因,我想自己控制数学 如何使用鼠标创建动态摄影机控件,如在Google SketchUp中单击鼠标中键并拖动 在谷歌StukCUP中,通过拖动鼠标,相机可以在平面中环动轨道虚构物体(不< /强>总是0,0,0)。它可以水平、垂直、甚至对角地在所有方向上运行。您可以查看gluLookAt()-网络上的许多图像显示了相机矢量,并附有说明。基本上,相机有一个位置、一个注视向量和一个向上向量。至于操纵,最常见的方法

请帮忙

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

如何使用鼠标创建动态摄影机控件,如在Google SketchUp中单击鼠标中键并拖动


在谷歌StukCUP中,通过拖动鼠标,相机可以在平面中环动轨道虚构物体(<强>不< /强>总是0,0,0)。它可以水平、垂直、甚至对角地在所有方向上运行。

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

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

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

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

我知道你的问题是2年半以前的事了,但是对于任何发生在这件事上的人来说,你可能都需要这些。我也在寻找sketchup行为,直到最近才在这个项目中找到它。它是.NET,但源代码是可用的,所以它应该能让您了解您正在寻找的内容


通过用户按住鼠标右键,然后移动鼠标,可在其控制下完成动态观察,仅供参考。控件中有一个属性,用于确定是希望行为围绕模型中心还是当前鼠标位置进行动态观察,因此我发现如果需要,它与sketchup的行为相同。

我知道你的问题是2年半前提出的,但对于任何发生这种情况的人来说,可能都有你需要的。我也在寻找sketchup行为,直到最近才在这个项目中找到它。它是.NET,但源代码是可用的,所以它应该能让您了解您正在寻找的内容

通过用户按住鼠标右键,然后移动鼠标,可在其控制下完成动态观察,仅供参考。控件中有一个属性,它决定了你是想让行为围绕模型的中心还是鼠标的当前位置旋转,所以我发现如果需要的话,它与sketchup的行为是相同的。

谷歌的术语是“arcball”。例如,见

但总的来说,有许多细微的差别可以让互动变得更好。

谷歌的术语是“arcball”。例如,见


但总的来说,有许多细微的差别可以使交互变得更好。

我理解基本原理,但我发现在Google Sketchup中模拟轨道行为非常棘手。我尝试了一些教程,结果完全不同。我理解基本原理,但我发现在谷歌Sketchup中模仿轨道行为非常棘手。我尝试了一些教程,结果非常不同。谢谢你的回答。在Sketchup中,轨道中心似乎是动态的,它的变化取决于摄影机的观察位置。如何测量?Sketchup中的中心是如何变化的?(我从未使用过)它必须位于屏幕的中心,所以这里唯一的变量是相机到轨道中心的距离。正确,在屏幕的中心。和如何计算“屏幕中心”?它并不总是在0,0,0或者你可能看到的对象的中心,在我给你的代码中没有“屏幕中心”值,那么你为什么需要这个:)?您应该只需要一个动态观察中心,这将取决于您的具体需要。因为我希望屏幕的中心作为我的动态观察中心谢谢您的回答。在Sketchup中,轨道中心似乎是动态的,它的变化取决于摄影机的观察位置。如何测量?Sketchup中的中心是如何变化的?(我从未使用过)它必须位于屏幕的中心,所以这里唯一的变量是相机到轨道中心的距离。正确,在屏幕的中心。和如何计算“屏幕中心”?它并不总是在0,0,0或者你可能看到的对象的中心,在我给你的代码中没有“屏幕中心”值,那么你为什么需要这个:)?您应该只需要一个环绕中心,这将取决于您的具体需要。因为我希望屏幕的中心作为我的环绕中心