脸部与相机的角度 - Three.js

ig-*_*dev 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)
Run Code Online (Sandbox Code Playgroud)

我渲染场景:

    @renderer.render(@scene, @camera)
Run Code Online (Sandbox Code Playgroud)

如何找出脸部与相机的角度?

澄清一下:如果我的三角形正指向相机,因此宽度和高度最大化,类似于这张图片,那么我预计角度为 0 度(或 180 度)。

如果脸部相对于相机旋转,其中三角形正好在一条线上,因为我完全从侧面看它,类似于这张图片,我预计角度为 90 度(或 270 度)。

mic*_*nil 5

我假设相机的方向对你来说并不重要,重要的是它的位置。

\n\n

您想要做的是获取面法线向量(指向三角形所面对的方向的向量)和指向从三角形到相机的方向的向量的点积。

\n\n

三角形和相机

\n\n

这里的n1向量是面法线:

\n\n
var triangleNormal = triangleMesh.geometry.faces[0].normal\n
Run Code Online (Sandbox Code Playgroud)\n\n

其中有单位长度。v是从三角形指向相机的向量

\n\n
var dirToCamera = camera.position.clone().sub(triangleMesh.position);\n
Run Code Online (Sandbox Code Playgroud)\n\n

n2是归一化v

\n\n
dirToCamera.normalize();\n
Run Code Online (Sandbox Code Playgroud)\n\n

现在,要得到 \xce\xb1,请取n1n2的点积

\n\n
var angleValue = triangleNormal.dot(dirToCamera);\n
Run Code Online (Sandbox Code Playgroud)\n\n

然而 \xc2\xb4angleValue\xc2\xb4 不以度数表示,它是度数的余弦。当三角形面向相机时,该值为 1;当呈 90 度时,该值为 0;当面向相反方向时,该值为 -1。

\n\n

如果你想要以度为单位,只需执行以下操作:

\n\n
var angle = Math.acos(angleValue) * 180/Math.PI;\n
Run Code Online (Sandbox Code Playgroud)\n\n

当更多的事情。计算n2时(dirToCamera ) 时,我使用了三角形网格位置。如果您使用的对象具有多个面,您可能需要计算每个三角形的中心点并使用它而不是网格位置。

\n\n

这是一个代码笔示例

\n