Three.js Object3d cylindre de rotation pour l'aligner sur un vecteur
J'ai cherché un peu partout, mais n'arrive pas à comprendre cette jolie chose fondamentale. J'ai vu d'autres exemples sur stackoverflow et ailleurs, dans un an ou deux, mais ils ne parviennent pas à travailler avec la dernière version de Three.js.
Voici une version de ce que je suis en train de travailler sur: http://medschoolgunners.com/sandbox/3d/.
Je vais essayer d'obtenir le cône gris exactement aligner avec les sans étiquette rouge vecteur. C'est à dire. Je veux la pointe du cône d'être exactement aligné avec le vecteur et le point depuis l'origine dans cette direction.
Voici le code que j'ai droit:
//FUNCTION TO CREATE A CYLINDER
function create_cylinder(radiusTop,radiusBottom, height, segmentsRadius, segmentsHeight, openEnded, color)
{
var material = new THREE.MeshLambertMaterial({
color: color, //0x0000ff
opacity: 0.2
});
var cylinder = new THREE.Mesh(new THREE.CylinderGeometry(radiusTop,radiusBottom, height, segmentsRadius, segmentsHeight, openEnded), material);
cylinder.overdraw = true;
return cylinder;
}
//ALIGN THE CYLINDER TO A GIVEN VECTOR
var alignVector=new THREE.Vector3(-50,50,50); //the vector to be aligned with
var newcylinder = create_cylinder(0.1, 10, 40, 50, 50, false, "0x0ff0f0"); //the object to be aligned with the vector above
var cylinderQuaternion = new THREE.Quaternion();
cylinderQuaternion.setFromEuler(alignVector);
newcylinder.useQuaternion = true;
newcylinder.quaternion=cylinderQuaternion;
scatterPlot.add(newcylinder);
OriginalL'auteur coder99 | 2012-01-27
Vous devez vous connecter pour publier un commentaire.
Si vous avez un vecteur arbitraire:
Vous pouvez aligner un objet, tel qu'un cylindre, pour le vecteur comme ceci:
Où
axis
est le sens originel de la bouteille (pointant vers le haut).Vous pouvez également déplacer le cylindre en fonction de la position du vecteur comme ceci:
Cela met une extrémité du cylindre à la
0, 0, 0
et l'autre à100, 60, 20
, et travaille parce que j'ai mis la longueur du cylindre àvector.length()
.Ce doit être marqué comme réponse.
OriginalL'auteur peterjwest
je sais que c'est une vieille question, mais au cas où quelqu'un est encore à se demander, ce qui a fonctionné pour moi a été l'ajout d'un vecteur le maillage de la position et de l'utilisation lookAt pour l'aligner sur le vecteur:
OriginalL'auteur Kevin Kuyl
Malheureusement je n'ai pas travaillé avec les Quaternions, ne peut donc pas aider beaucoup. Il semble à mon que certains de la compensation est nécessaire, étant donné que le cylindre du pivot est au centre de la maille, et non pas à une fin.
Si joué avec des matrices un peu, et j'ai obtenu des résultats décents.
Voici un moyen de cela, en utilisant Mesh lookAt() méthode:
Cela dessine un cylindre qui commence à p1 se termine à p2 et est orientée vers elle.
La compensation peut-être besoin de quelques ajustements, mais la géométrie suit le vecteur direction d'assez près.
Il y a aussi la version longue de manuellement le calcul des matrices, plutôt que de s'appuyer sur la lookAt() fonctionnalité:
Ce me ressemble plus de travail que d'utiliser les quaternions, de ce que je vois tu t'en es code. Si le setFromEuler fait la magie pour l'orientation, le maillage de la géométrie pourraient encore avoir besoin de se déplacer (de pivot d'une fin plutôt qu'au centre)
HTH
OriginalL'auteur George Profenza