2017-05-21 4 views
1

Ich möchte Partikel, die vom Wind angetrieben werden, auf einem three.js Globus simulieren. Die Daten, die ich habe, sind ein Vector3 für die Position eines Partikels und ein Vector2, der die Windgeschwindigkeit und -richtung anzeigt, denke nach Norden/Osten. Wie bekomme ich den neuen Vector3?Wie man einen Vector3 mit Vector2 dreht?

Ich habe zahlreiche Beispiele konsultiert und die Dokumentation gelesen und glaube, dass die Lösung Quaternionen beinhaltet, aber die Rotationsachse ist nicht gegeben. Außerdem gibt es Tausende von Partikeln, es sollte schnell sein, Echtzeit ist jedoch nicht erforderlich.

Der Radius der Kugel ist 1.

+0

Ich habe wirklich keine Zeit, um in diese zu tauchen, aber es klingt ähnlich zu etwas, das ich [hier] beantwortet habe (http://stackoverflow.com/questions/43469555/three-js-particles-orbiting-a-point- in-random-direction-forming-a-sphere/43481278 # 43481278) vorher (siehe auch Kommentare zu Arbeitsbeispielen). Du könntest das wahrscheinlich mit Quaternionen machen, aber ich denke Vector3.ApplyAxisAngle (Achse, Winkel) wird gut funktionieren. – micnil

Antwort

1

Ich würde Ihnen empfehlen, einen Blick auf die von three.js vorgesehen Spherical Klasse. Anstelle von kartesischen Koordinaten (x, y, z) wird ein Punkt in Form einer spherical coordinate-system (θ (Theta), φ (Phi), r) dargestellt.

spherical coordinate system

Der Wert von Theta der Länge und phi ist der Spielraum für Ihre Kugel (r - sphereRadius die Höhe über der Oberfläche wäre). Ihre Windvektoren können dann als Änderungen dieser beiden Werte interpretiert werden. Also, was ich versuchen würde, ist im Grunde diese:

// a) convert particle-location to spherical 
const sphericalPosition = new THREE.Spherical() 
    .setFromVector3(particle.position); 

// b) update theta/phi (note that windSpeed is assumed to 
// be given in radians/time, but for a sphere of size 1 that 
// shouldn't make a difference) 
sphericalPosition.theta += windSpeed.x; // east-direction 
sphericalPosition.phi += windSpeed.y; // north-direction 

// c) write back to particle-position 
particle.position.setFromSpherical(sphericalPosition); 

Performance weise dies kein Problem sein sollte (vielleicht schaffen keine neue Spherical-Instanz für jedes Teilchen, wie ich oben tat). Die Konvertierungen beinhalten ein bisschen Trigonometrie, aber wir sprechen nur Tausende von Punkten, nicht Millionen.

Hoffe, dass hilft!

+0

Das sieht genau wie benötigt aus, thx, wird heute testen. – noiv

+0

Ausgezeichnet! Ich mag 4-Linien-Lösungen. (82dev braucht keine Position in c). – noiv

0

Wenn Sie nur einen Vektor auf einem Winkel auf Basis gedreht werden soll, nur eine einfache Drehung von Werten auf der angegebenen Ebene durchführen, sich für eine Rotation auf der XZ-Ebene trig as per this page zB mit:

var x = cos(theta)*vec_to_rotate.x - sin(theta)*vec_to_rotate.z; 
var z = sin(theta)*vec_to_rotate.x + cos(theta)*vec_to_rotate.z; 
rotated_vector = new THREE.Vector3(x,vec_to_rotate.y,z); 

Aber bewege Partikel mit Wind, du drehst nicht wirklich einen Vektor, du solltest einen Geschwindigkeitsvektor hinzufügen, und er "dreht" seinen eigenen Kurs basierend auf einer Kombination aus Anfangsgeschwindigkeit, Trägheit, Luftreibung und zusätzlichen konkurrierenden Kräften a la:

init(){ 
    position = new THREE.Vector(0,0,0); 
    velocity = new THREE.Vector3(1,0,0); 
    wind_vector = new THREE.Vector3(0,0,1); 
} 

update(){ 
    velocity.add(wind_vector); 
    position.add(velocity); 
    velocity.multiplyScalar(.95); 
} 

Dies Das Modell ist wahrer, wie der Wind ein Teilchen beeinflusst. Dieses Teilchen wird entlang der x-Achse beginnen und dann "drehen", um schließlich in die Richtung des Windes zu gehen, ohne irgendeine Drehung der Vektoren. Es hat eine Masse und eine Geschwindigkeit in einer Richtung, eine Kraft wirkt darauf, es wendet sich.

enter image description here

Sie können sehen, dass, weil die ganze Geschwindigkeit Reibung unterliegt (die multscalar), unsere Anfangsgeschwindigkeit nimmt ab, wenn der Windvektor akkumuliert, was eine wiederum bewirkt, ohne Drehungen ausführen. Dachte, ich würde das rausschmeißen, nur für den Fall, dass Sie mit Partikelsystemen nicht vertraut sind und vielleicht nur falsch darüber nachgedacht haben.