如果我创建一个只有一个面(三角形)的几何体,如下所示:
[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 度)。
我假设相机的方向对你来说并不重要,重要的是它的位置。
\n\n您想要做的是获取面法线向量(指向三角形所面对的方向的向量)和指向从三角形到相机的方向的向量的点积。
\n\n\n\n这里的n1向量是面法线:
\n\nvar triangleNormal = triangleMesh.geometry.faces[0].normal\nRun Code Online (Sandbox Code Playgroud)\n\n其中有单位长度。v是从三角形指向相机的向量
\n\nvar dirToCamera = camera.position.clone().sub(triangleMesh.position);\nRun Code Online (Sandbox Code Playgroud)\n\nn2是归一化的v:
\n\ndirToCamera.normalize();\nRun Code Online (Sandbox Code Playgroud)\n\n现在,要得到 \xce\xb1,请取n1和n2的点积
\n\nvar angleValue = triangleNormal.dot(dirToCamera);\nRun Code Online (Sandbox Code Playgroud)\n\n然而 \xc2\xb4angleValue\xc2\xb4 不以度数表示,它是度数的余弦。当三角形面向相机时,该值为 1;当呈 90 度时,该值为 0;当面向相反方向时,该值为 -1。
\n\n如果你想要以度为单位,只需执行以下操作:
\n\nvar angle = Math.acos(angleValue) * 180/Math.PI;\nRun Code Online (Sandbox Code Playgroud)\n\n当更多的事情。计算n2时(dirToCamera ) 时,我使用了三角形网格位置。如果您使用的对象具有多个面,您可能需要计算每个三角形的中心点并使用它而不是网格位置。
这是一个代码笔示例
\n| 归档时间: |
|
| 查看次数: |
2637 次 |
| 最近记录: |