我正在开发一个类似 DCC 的工具,带有 3D 视口(viewport),您可以用鼠标移动它,类似于 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
通常我会凭经验做这样的事情,尝试不同的值,直到找到我喜欢的东西,但为此我认为是时候尝试理论了。
最佳答案
对于问题 1,只需使用比例速度缩放即可。
currSpeed = currDistToTarget * refSpeed / refDistToTarget
其中 refSpeed 和 refDistToTarget 是您通过实验认为可以接受的值。
对于问题 2,其想法是相同的 - 即计算距离加权角度。如果您的视场永远不会改变,您可以尝试与上面提到的相同的线性速度缩放。这里最主要的是找到 refDistanceToTarget 和 refSpeed 的正确值。
关于input - 根据到目标的距离缩放 3D 相机平移/缩放,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/11315069/