1

私はこれを使用して3Dメッシュマニピュレーターに取り組んでいます:http://leapmotion.com。これまでは、ポイントを「つかんで」動かすことでうまく操作できましたが、メッシュを回転させて反対側の面で作業できるようにしたいと考えています。私が行ったことは、以下に示すように、「回転可能」と呼ばれるオブジェクトを追加することです。

scene=new THREE.Scene();
camera = new THREE.PerspectiveCamera(70,window.innerWidth/window.innerHeight,1,8000)
renderer=new THREE.WebGLRenderer( { clearColor: 0x000000, clearAlpha: 1, maxLights:5 } )


//This is the 'Mesh Scene'
rotatable = new THREE.Object3D()
scene.add(rotatable)


//Mesh we are altering
var material = new THREE.MeshNormalMaterial()
material.side=2

var geom = new THREE.SphereGeometry(200,10,10); 
var sphere = new THREE.Mesh(geom, material)

rotatable.add(sphere)

次に、この球の頂点を変更しようとしていますが、そのためには、頂点が「つかまれている」かどうかを確認するために「衝突テスト」を実行する必要があります。これには、頂点の位置を確認し、頂点の位置が一致するかどうかを確認することが含まれます。指の位置の(以下の擬似コード)

if(finger.x == vertex.x && finger.y == vertex.y && finger.z == vertex.z){
    vertex.grabbed = true 
}

これは、回転可能な回転がゼロの場合は正常に機能しますが、回転を開始した場合でも、衝突テストは回転していない頂点の位置をテストします(これは理にかなっています)。私の質問は、「シーン/グローバル」位置にある頂点の位置を見つける方法です。これまでのところ、これを行うことを考えることができる唯一の方法は、「回転可能」の回転を計算し、このベクトルを使用して新しい頂点位置を計算することです。

私は数学について何も知らないので、これは進むべき道ではないかもしれません、そしてそれがあったとしても、私はそれを苦労しなければならないので、私が数学を間違ってやっているだけなのか、これはそうではないのかわかりませんそれを計算する方法ではありません。明らかに、私はこの作業を進んで実行しますが、他のより単純な方法ではなく、これがそれを実行する方法であることを確認したいだけです。

コードについて他にご不明な点がございましたら、お気軽にお問い合わせください。よろしくお願いいたします。

アイザック

4

1 に答える 1

3

ローカル座標で指定された頂点のワールド位置を取得するには、次のようにオブジェクトのワールド変換を頂点に適用します。

vertex.applyMatrix4( object.matrixWorld );

(私は飛躍に精通していないので、うまくいけば、この答えに影響を与えません。)

ヒント:maxLights不要になりました。そして、避けるのが最善material.side = 2です。material.side = THREE.DoubleSide代わりに使用してください。

定数はここにあります:https ://github.com/mrdoob/three.js/blob/master/src/Three.js

three.js r.55

于 2013-02-02T18:20:54.747 に答える