Three.js - 如何制作不同位置的物体使用矢量看正交相机?

时间:2017-03-26 08:41:49

标签: vector camera three.js

Three.js 76

我开始使用正交相机代替透视 - 有一些麻烦。

我在场景中使用了stemkoski的着色器 - 用于点动画:他创建了一些球体,然后使用着色器进行透明度,我只是为它添加动画。

function animatePoints() {        
    var alphas;
    var count;
    var time;

    let j = 0;

    while ( animatedPoints[j] ) {

        let threeGlow = animatedPoints[j];

        let finishAnimation = threeGlow.meta.state.finishAnimation;
        let itFinished = 0;
        let pointGlowMat = threeGlow.material;
        let pointGlowGeom = threeGlow.geometry;

        // ########## make glow look at camera
        pointGlowMat.uniforms.viewVector.value = new THREE.Vector3().subVectors( threeGlow.position, camera.position);

        alphas = pointGlowGeom.attributes.alpha;
        count = alphas.count;
        time = 0.001* Date.now();

        if ( finishAnimation ) {
            ....
        } else {
            ....
        }

        alphas.needsUpdate = true;
        j++;
    }

}

主要目标 - 让发光看着相机。当相机是透视时我使用解决方案减去两个矢量 - 相机位置和发光位置,所以看起来像发光看着相机。

pointGlowMat.uniforms.viewVector.value = new THREE.Vector3().subVectors( camera.position, threeGlow.position );

但现在,当我使用正交相机时,此解决方案无法正常工作。 问题是现在发光应该看不到相机位置点,它应该看相机的平面。

我针对这种情况制作了一些照片计划:look it, it very useful

因此,对于每个新的发光(它的位置当然不同),我必须得到新的红色矢量,让每个发光都看到orto cam。

有什么想法吗?

2 个答案:

答案 0 :(得分:0)

在图像中获取红色矢量需要做的是在向量上的项目向量sub,表示摄像机正在查看的方向。

我认为这就是你所需要的:

pointGlowMat.uniforms.viewVector.value = new THREE.Vector3()
    .subVectors( camera.position, threeGlow.position )
    .projectOnVector( camera.getWorldDirection() );

答案 1 :(得分:0)

制作物品的一种方法"看看"使用这种模式的正交相机:

object.quaternion.copy( camera.quaternion );

对象的视图方向将垂直于相机的投影平面。

如果对象和相机都没有旋转的父级,则此方法是合适的。

three.js r.84