Comment faire pivoter un objet 3D sur l'axe three.js?
J'ai un grand problème à propos de la rotation dans three.js
Je veux faire tourner mon cube 3D dans l'un de mes jeu.
//init
geometry = new THREE.CubeGeometry grid, grid, grid
material = new THREE.MeshLambertMaterial {color:0xFFFFFF * Math.random(), shading:THREE.FlatShading, overdraw:true, transparent: true, opacity:0.8}
for i in [1...@shape.length]
othergeo = new THREE.Mesh new THREE.CubeGeometry(grid, grid, grid)
othergeo.position.x = grid * @shape[i][0]
othergeo.position.y = grid * @shape[i][1]
THREE.GeometryUtils.merge geometry, othergeo
@mesh = new THREE.Mesh geometry, material
//rotate
@mesh.rotation.y += y * Math.PI / 180
@mesh.rotation.x += x * Math.PI / 180
@mesh.rotation.z += z * Math.PI / 180
et (x, y, z) peut être (1, 0, 0)
puis le cube peut tourner, mais le problème est que le cube tourne sur son propre axe,donc après qu'il a tourné, il ne peut pas tourner comme prévu.
Je trouve la page Comment faire pivoter une Three.js Vector3 autour d'un axe?, mais il vient de laisser une Vector3 point de pivoter autour de l'axe du monde?
et j'ai essayé d'utiliser matrixRotationWorld comme
@mesh.matrixRotationWorld.x += x * Math.PI / 180
@mesh.matrixRotationWorld.y += y * Math.PI / 180
@mesh.matrixRotationWorld.z += z * Math.PI / 180
mais ça ne fonctionne pas, je n'ai pas si je l'ai utilisé dans un mauvais sens ou il y a d'autres façons de faire.
alors, comment laisser la 3D cube en rotation autour de l'axe du monde???
- Qu'est ce que
@
notation? - '@' dans CoffeeScript signifie " ce. en JavaScript. C'est une abréviation.
Vous devez vous connecter pour publier un commentaire.
Voici les deux fonctions que j'utilise. Ils sont basés sur la matrice de rotation. et peut pivoter autour d'arbitraire axes. Pour faire pivoter en utilisant les axes que vous souhaitez utiliser la deuxième fonction rotateAroundWorldAxis().
De sorte que vous devez appeler ces fonctions au sein de votre
anim
fonction (requestAnimFrame de rappel), résultant en une rotation de 90 degrés sur l'axe des x:rotateAroundWorldAxis
ne fonctionne PAS pour les non-mise à l'échelle uniforme appliqué à l'objet.Vous devez extraire la rotation deobject.matrix
, se multiplient avecrotWorldMatrix
et de définir les composants deobject.rotation
du résultat.object.matrix
que cette matrice est un composite de la rotation, l'échelle et de la transformer. Pour être sûr de la non-uniforme à l'échelle vous pouvez utiliserobject.matrix.extractRotation(m)
et de multiplier la matricem
avecrotWorldMatrix
. Enfin, vous pouvez faireobject.rotation.setFromRotationMatrix(m)
. Si vous avezmatrixAutoUpdate = true
le changement à la propriété de rotation va enfin être composés dans laobject.matrix
par ThreeJS automatiquement.Depuis la libération r59, three.js fournit ces trois fonctions pour faire pivoter un objet autour de l'axe de l'objet.
This is typically done as a one time operation, and not during a loop Use Object3D.rotation for typical real-time mesh rotation.
J'avais besoin de la
rotateAroundWorldAxis
fonction, mais le code ci-dessus ne fonctionne pas avec la dernière version (r52). Il ressemble àgetRotationFromMatrix()
a été remplacé parsetEulerFromRotationMatrix()
avec r55 vous devez changer
rotationMatrix.multiplySelf( objet.la matrice );
pour
rotationMatrix.la multiplication( de l'objet.la matrice );
Dans Three.js R59,
object.rotation.setEulerFromRotationMatrix(object.matrix);
a été modifié pourobject.rotation.setFromRotationMatrix(object.matrix);
3js est en train de changer si rapidement 😀
Juste au cas où...dans r52 la méthode est appelée
setEulerFromRotationMatrix
au lieu degetRotationFromMatrix
Quelque part autour de r59 cela devient plus facile (rotation autour de x):
Dans Three.js R66, c'est ce que j'utilise (CoffeeScript version):
J'ai résolu ce problème de cette façon:
J'ai créé le "ObjectControls' module pour ThreeJS qui permet de faire pivoter un OBJET unique (ou un Groupe), et non de la SCÈNE.
Inclure la bibliothèque:
<script src="ObjectControls.js"></script>
Utilisation:
var controls = new THREE.ObjectControls(camera, renderer.domElement, yourMesh);
Vous pouvez trouver ici une démo en live ici: https://albertopiras.github.io/threeJS-object-controls/
Ici est le repo: https://github.com/albertopiras/threeJS-object-controls.