Three.js - 在没有相机的情况下获取屏幕位置
Three.js - get screen position with no camera
我需要在没有相机的情况下计算三之外的屏幕位置。
我知道物体位置、相机位置和相机目标
我看过很多说明,例如
vector.project(camera);
vector.x = Math.round( ( vector.x + 1 ) * w / 2 );
vector.y = Math.round( ( - vector.y + 1 ) * h / 2 );
我了解 Vector.project 相机会考虑我假设的相机设置、FOV 等?
Vector3 有 projectOnVector(),这和 vector3.project(camera) 做同样的事情吗?
有没有办法在无法访问相机的情况下计算对象在屏幕上的位置?
是的,Vector3.project
考虑了相机设置...
当您尝试将位置从世界 space 转换为视图 space 时,您需要计算投影矩阵。这是一个很棒的小动画,描述了这一点的旅程:https://jsantell.com/model-view-projection/mvp.webm (lifted from this useful page: https://jsantell.com/model-view-projection/)。
如果您查看这三个源代码,它将向您展示执行此操作所需的一切。 Vector3.project 只是应用来自相机的两个矩阵:
return this.applyMatrix4( camera.matrixWorldInverse ).applyMatrix4( camera.projectionMatrix );
那么如何得到这些矩阵呢?生成项目矩阵here.
您可以忽略视图、倾斜和缩放,因此您只需要近距离、远距离、纵横比和视野。
updateProjectionMatrix() {
const near = this.near;
let top = near * Math.tan( MathUtils.DEG2RAD * 0.5 * this.fov );
let height = 2 * top;
let width = this.aspect * height;
let left = - 0.5 * width;
this.projectionMatrix.makePerspective( left, left + width, top, top - height, near, this.far );
}
如果你需要 makePerspective
就是 here
matrixWorldInverse
就是...取你的世界矩阵并将其求逆。 Three.js 做到了 here.
这为您提供了视图矩阵。所以,视图矩阵乘以投影给你屏幕 space 位置......就像在着色器中一样,即:
gl_Position = projectionMatrix * modelViewMatrix * vec4(pos, 1.0);
我假设您的观点是在世界 space 中,因此您可以忽略模型部分,因为这只是将您从模型带到世界。
我需要在没有相机的情况下计算三之外的屏幕位置。
我知道物体位置、相机位置和相机目标
我看过很多说明,例如
vector.project(camera);
vector.x = Math.round( ( vector.x + 1 ) * w / 2 );
vector.y = Math.round( ( - vector.y + 1 ) * h / 2 );
我了解 Vector.project 相机会考虑我假设的相机设置、FOV 等?
Vector3 有 projectOnVector(),这和 vector3.project(camera) 做同样的事情吗?
有没有办法在无法访问相机的情况下计算对象在屏幕上的位置?
是的,Vector3.project
考虑了相机设置...
当您尝试将位置从世界 space 转换为视图 space 时,您需要计算投影矩阵。这是一个很棒的小动画,描述了这一点的旅程:https://jsantell.com/model-view-projection/mvp.webm (lifted from this useful page: https://jsantell.com/model-view-projection/)。
如果您查看这三个源代码,它将向您展示执行此操作所需的一切。 Vector3.project 只是应用来自相机的两个矩阵:
return this.applyMatrix4( camera.matrixWorldInverse ).applyMatrix4( camera.projectionMatrix );
那么如何得到这些矩阵呢?生成项目矩阵here.
您可以忽略视图、倾斜和缩放,因此您只需要近距离、远距离、纵横比和视野。
updateProjectionMatrix() {
const near = this.near;
let top = near * Math.tan( MathUtils.DEG2RAD * 0.5 * this.fov );
let height = 2 * top;
let width = this.aspect * height;
let left = - 0.5 * width;
this.projectionMatrix.makePerspective( left, left + width, top, top - height, near, this.far );
}
如果你需要 makePerspective
就是 here
matrixWorldInverse
就是...取你的世界矩阵并将其求逆。 Three.js 做到了 here.
这为您提供了视图矩阵。所以,视图矩阵乘以投影给你屏幕 space 位置......就像在着色器中一样,即:
gl_Position = projectionMatrix * modelViewMatrix * vec4(pos, 1.0);
我假设您的观点是在世界 space 中,因此您可以忽略模型部分,因为这只是将您从模型带到世界。