input - 根据到目标的距离缩放 3D 相机平移/缩放

标签 input 3d perspectivecamera

我正在开发一个类似 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/

相关文章:

python - 高效的平行 3D 旋转

python - Opencv:好的点匹配,但单应性错误

ios - 如何允许用户在页面的任意位置添加文本? ( swift )

c++ - 从 3D 空间中的 2 个点计算四元数/旋转

html - 在 css 的一个输入占位符中可以有 2 种不同的字体大小吗?

c++ - 在 3d 空间中的 QT 中围绕其 Y 轴旋转小部件

javascript - Three.js透视相机当前 Angular (以度为单位)

opencv - OpenGL 透视矩阵的固有相机参数 : Near Far Parameters?

c++ - cin 如何将字符转换为相应的类型

javascript - 使用 jQuery/JavaScript 复制到剪贴板文本框值