2016-04-03 53 views
0

如果我創建只有一個面(三角形)的幾何形狀,如:視角相機 - three.js所

[CoffeeScript的語法]

geometry = new THREE.Geometry() 
    geometry.vertices.push(new THREE.Vector3(0, 0, 0)) 
    geometry.vertices.push(new THREE.Vector3(0, 10, 0)) 
    geometry.vertices.push(new THREE.Vector3(0, 10, 10)) 
    geometry.faces.push(new THREE.Face3(0, 1, 2)) 
    mesh = new THREE.Mesh(geometry, material) 
    mesh.position.x = 10 
    @scene.add(mesh) 

我渲染場景:

@renderer.render(@scene, @camera) 

我怎樣才能找出臉上的角度是相機的角度?

澄清:如果我三角指向右邊的相機,使寬度和高度最大化,那麼我會期望角度爲0deg(或180deg)。

如果臉部正在旋轉到相機的三角形正好在線上,因爲我正在側面看它,我會期望角度爲90度(或270度)。

回答

2

我打算假設相機看的方向對你來說並不重要,只是它的位置是。

你想要做的是取臉的法向量(指向三角形所面向的方向的矢量)和指向三角形到相機方向的矢量的點積。

triangle and camera

這裏N1載體是面部正常:

var triangleNormal = triangleMesh.geometry.faces[0].normal 

具有單位長度。 v是從三角形指向相機矢量

var dirToCamera = camera.position.clone().sub(triangleMesh.position); 

N2是剛剛歸v

dirToCamera.normalize(); 

現在,讓α,你拿點n1n2

var angleValue = triangleNormal.dot(dirToCamera); 

然而'angleValue'不是以度數表示,它是度數的餘弦。當三角形面向攝像機時,此值爲1,90度時爲0,朝向相反方向時爲-1。

如果你想它以度,只是做:

var angle = Math.acos(angleValue) * 180/Math.PI; 

當更多的事情。在計算n2dirToCamera)時,我使用了三角形網格位置。如果您使用的是具有多個面的對象,則可能需要計算每個三角形的中心點,並使用該中心點代替網格位置。

這是codepen example