我正在使用类似DCC的工具,带有3D视口,您可以使用鼠标移动,类似于Maya,Blender等。
我需要一些数学方面的帮助。
我试图确定两点。第一个是基于到目标的距离的小车速度。在小尺度上(例如,dist = 10 ^ -3),它太快速,并且在大尺度上(例如,dist = 10 ^ 6),它太慢了。我想要一个平坦的“相机速度”输入,可以整体调整效果,但在所有尺度下,相机应该感觉相同。如果我距离0.1或1000个单位无关紧要,对于给定的鼠标增量,它应该感觉我以相同的速度接近目标。
另一种是相机平移,也基于相机距离。实际上,我希望摄像机目标能够沿着与摄像机对齐的平面完美地跟踪鼠标光标,并且距离distance_to_target
个单位。我不确定透视失真是否会影响这个?
输入是:
// Distance in world units to camera's centre of interest
real distance_to_target
// Number of pixels mouse has moved horizontally since last frame
int mouse_delta_x
// Number of pixels mouse has moved vertically since last frame
int mouse_delta_y
// The vector of the mouse delta, normalized into -1 to 1 space based on
// viewport dimensions where a value of (-1,-1) or (1,1) means the cursor
// moved from one corner of the viewport to the other, or further, since
// the last frame.
vec2 mouse_delta_vector
// Scale the dolly speed
real dolly_speed
通常我会根据经验做这样的事情,尝试不同的价值观,直到找到我喜欢的东西,但为此我觉得是时候尝试理论了。
答案 0 :(得分:4)
对于问题1,只需使用比例速度缩放。
currSpeed = currDistToTarget * refSpeed / refDistToTarget
其中refSpeed和refDistToTarget是您认为可以通过实验接受的值。
至于问题2,这个想法是相同的 - 也就是说,你计算一个距离加权角度。如果您的FOV永远不会改变,您可以尝试与上面提到的相同的线性速度缩放。这里的主要内容是为refDistanceToTarget和refSpeed找到正确的值。