2017-05-27 50 views
0

我掙扎着一個Object3D,它的子網格應該看着相機的位置。
如果相機距離「遠」,它可以正常工作,但如果相機朝向物體移動,則無法正常工作。Three.js Object3d兒童lookAt相機的位置

如果相機位置接近物體位置,則第二個添加的平面會旋轉,直到相機看到平面的邊緣。

而且我知道爲什麼這種行爲只出現在第二個添加的平面上,並且恰好相機接近物體位置。

這是我到目前爲止。
創建對象:

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; 
} 

我可以打電話給this.lookAt(pos)obj.update(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()); 
    } 
}); 

編輯:我只注意到這種行爲只是發生,如果對象的位置不是(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()'不支持翻譯父(S)在一般情況下,爲什麼像它應該的行爲首先添加飛機?但很高興知道,謝謝! –

+0

您的問題對我來說太複雜了。 – WestLangley

+0

@WestLangley「lookAt()不支持具有旋轉和/或翻譯父對象的對象。」什麼時候才能解決?有沒有計劃修復它? – trusktr