2017-05-27 25 views
0

私はObject3Dに苦労しています。これは、子メッシュがカメラの位置を見なければなりません。
カメラが遠く離れているとうまく動作しますが、カメラがオブジェクトの方に移動しても動作しません。Three.js Object3d child lookAtカメラの位置

カメラの位置がオブジェクトの位置に近い場合、カメラが計画の端を見るまで、2番目に追加された面が回転します。

そして、私はこの現象が2番目の追加された平面にちょうど現れ、なぜカメラがオブジェクトの位置に近づいているのか知っています。

ここまでは私がこれまで持っていたものです。

var obj = new THREE.Object3D(); 
obj.position.set(x, y, z); 
var Uniforms = { 
    texturePrimary:  { type: "t", value: Texture }, 
    textureColorGraph: { type: "t", value: ColorGraph }, 
    time:    { type: "f", value: 0 }, 
    color: { type: "f", value: 0 } 
}; 

obj.Uniforms = Uniforms; 
obj.add(makeplane1(3.2, Uniforms)); 
obj.add(makeplane2(25, Uniforms)); 

obj.update = function(pos){ 
    this.Uniforms.time.value = shaderTiming; 
    $.each(this.children, function(i,mesh){ 
     if(mesh.name === "plane1" || mesh.name === "plane2"){ 
      var vec = mesh.parent.worldToLocal(pos); 
      mesh.lookAt(vec); 
     } 
    }); 
}; 

function makePlane1(radius, uniforms){ 
    var Geo = new THREE.PlaneGeometry(radius, radius); 
    var Material = new THREE.ShaderMaterial(
     { 
     uniforms:  uniforms, 
     vertexShader: shaders[1].vertex, 
     fragmentShader: shaders[1].fragment, 
     blending: THREE.AdditiveBlending, 
     transparent: true 
     }; 

var plane = new THREE.Mesh(Geo, Material); 
plane.name = "plane1"; 
return plane; 
); 

function makePlane2(radius, uniforms){ 
    var Geo = new THREE.PlaneGeometry(radius, radius); 
    var Material = new THREE.ShaderMaterial(
     { 
     uniforms:  uniforms, 
     vertexShader: shaders[2].vertex, 
     fragmentShader: shaders[2].fragment, 
     blending: THREE.AdditiveBlending, 
     transparent: true 
     }; 
); 

var plane = new THREE.Mesh(Geo, Material); 
plane.name = "plane2"; 
return plane; 
} 

私はオブジェクト全体を回転させるobj.update(pos)this.lookAt(pos)を呼び出すことができますが、それは悲しいことに何のオプションではありませんので、他のメッシュは、そのように回転させてはならない:
は、オブジェクトを作成します。

そして、両方の面のためのシンプルな頂点シェーダー:

varying vec2 vUv; 
void main() { 
    gl_Position = projectionMatrix * modelViewMatrix * vec4(position, 1.0); 
    vUv = uv; 
} 

そして私はanimationloopに呼び出す:

$.each(scene.children, function(i, obj){ 
    if(obj.update !== undefined) { 
     shaderTiming = (time - startTime)/ 1000; 
     obj.update(camera.getWorldPosition()); 
    } 
}); 

EDIT:私はちょうど、この動作がちょうど発生していることに気づきましたオブジェクトの位置が(0,0,0)でない場合もしそうなら、それはどんなカメラ位置でもそうであるように機能します。
カメラからオブジェクトへの単純な距離計算も正しく機能していません。

vec1 = this.position; 
vec2 = camera.position; 
var dist = Math.sqrt(Math.pow(vec1.x - vec2.x, 2) + Math.pow(vec1.y - vec2.y, 2) + Math.pow(vec1.z - vec2.z, 2)); 

ありがとうございます。

答えて

0

Object3D.lookAt()は、親の回転および/または翻訳されたオブジェクトをサポートしていません。

three.js r.85

+0

'.lookAtは()'一般的に翻訳された親(複数可)をサポートしていない場合、なぜそれが必要のように最初に追加プレーンは動作しますか?しかし、知ってうれしい、ありがとう! –

+0

あなたの質問は、私に従うにはあまりにも複雑です。 – WestLangley

+0

@WestLangley "lookAt()は、親の回転および/または翻訳されたオブジェクトをサポートしていません。"それはいつ修正されるのですか?それが修正される計画はありますか? – trusktr

関連する問題