我需要在沒有攝像頭的情況下計算三之外的螢屏位置。
我知道物體位置、相機位置和相機目標
我看過很多指令,例如three.js Vector3 to 2D screen coordinate with rotate scene
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) 做同樣的事情嗎?
有沒有辦法在無法訪問相機的情況下計算物件在螢屏上的位置?
uj5u.com熱心網友回復:
是的,Vector3.project考慮到相機設定...
當您嘗試將位置從世界空間轉換到視圖空間時,您需要計算投影矩陣。這是一個很棒的小影片,描述了這一點將帶來的旅程:https ://jsantell.com/model-view-projection/mvp.webm (從這個有用的頁面提取:https ://jsantell.com/model-view-投影/)。
如果您查看這三個源代碼,它將向您展示執行此操作所需的一切。Vector3.project只是應用相機中的兩個矩陣:
return this.applyMatrix4( camera.matrixWorldInverse ).applyMatrix4( camera.projectionMatrix );
那么如何獲得這些矩陣呢?專案矩陣在這里生成。
您可以忽略視圖、傾斜和縮放,因此您只需要近、遠、縱橫比和 fov。
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它就在這里
matrixWorldInverse就是這樣......取你的世界矩陣并將其反轉。Three.js 在這里做。
這為您提供了您的視圖矩陣。因此,與投影相乘的視圖矩陣可以為您提供螢屏空間位置......就像在著色器中一樣:
gl_Position = projectionMatrix * modelViewMatrix * vec4(pos, 1.0);
我假設您的觀點是在世界空間中,因此您可以忽略模型部分,因為這只是將您從模型帶到世界。
轉載請註明出處,本文鏈接:https://www.uj5u.com/yidong/477031.html
