面对摄影机的角度-three.js

面对摄影机的角度-three.js,three.js,Three.js,如果我创建一个只有一个面的几何体(三角形),如下所示: [咖啡脚本语法] 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)) geome

如果我创建一个只有一个面的几何体(三角形),如下所示:

[咖啡脚本语法]

    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)
我怎样才能知道脸与相机的角度是多少

澄清一下:如果我看到三角形正对着相机,那么宽度和高度都最大化了,那么我希望角度为0度(或180度)


如果面与相机旋转,而三角形正好在直线上,因为我正从侧面看它,我预计角度为90度(或270度)。

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

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

这里的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);
然而,“角度值”不是以度表示的,它是度的余弦。当三角形朝向摄影机时,该值为1;当三角形成90度时,该值为0;当三角形朝向相反方向时,该值为-1

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

var angle = Math.acos(angleValue) * 180/Math.PI;
当更多的事情发生时。当计算n2时(
dirToCamera
),我使用了三角形网格位置。如果使用的对象具有多个面,则可能需要计算每个三角形的中心点,并使用该点而不是网格位置


这里有一个

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

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

这里的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);
然而,“角度值”不是以度表示的,它是度的余弦。当三角形朝向摄影机时,该值为1;当三角形成90度时,该值为0;当三角形朝向相反方向时,该值为-1

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

var angle = Math.acos(angleValue) * 180/Math.PI;
当更多的事情发生时。当计算n2时(
dirToCamera
),我使用了三角形网格位置。如果使用的对象具有多个面,则可能需要计算每个三角形的中心点,并使用该点而不是网格位置

这是一个