Hi,
I’m trying to place Planes on a Sphere surface but I want the planes to be aligned with the sphere center and squared to the surface (like trees on a planet).
I tried several approaches but none seem to work e.g. using lookAt(%sphere_center%)
or with the space coordinates getting the phi an theta and apply them as a rotation
const pos = geoCoordTo3Dposition(ep.location.latitude, ep.location.longitude, 200);
const sp = new Spherical().setFromCartesianCoords(pos.x, pos.y, pos.z);
// then use rotation like [sp.phi, sp.theta, 0] on my mesh
So I’m wondering what is the best way to get the correct rotation of my object based on its position.
Thanks,
G.
1 Like
Hi!
You can find many examples on @hofk 's site: * discourse.threejs.hofk.de
And these are amongst them:
- Planes on Sphere
- Trees on Sphere
3 Likes
//mesh
var p = piece.mesh.clone();
//set on sphere
var randPhi = (Math.random()*Math.PI*1) - (Math.PI/2); //horiz, subtract Math.PI/2 so only in top half of sphere
var randTheta = (Math.random()*Math.PI*1) - (Math.PI/2); //vert, subtract Math.PI/2 so only in top half of sphere
p.position.setFromSphericalCoords(this.globeRadius,randPhi,randTheta);
p.position.y += this.globeOffsetY; //move down to align with sphere offset
//align on sphere
var vectorToPointOnSphere = new THREE.Vector3();
var sphericalCoord = new THREE.Spherical(this.globeRadius,randPhi,randTheta);
vectorToPointOnSphere.setFromSpherical(sphericalCoord);
var originalOrientation = new THREE.Vector3(0, 1, 0);
p.quaternion.setFromUnitVectors(originalOrientation, vectorToPointOnSphere.normalize());
//add to scene
_G.THREE.scene.add(p);
Looks like setFromSphericalCoords is what you need for this.
Results from the tree demo @prisoner849 linked look like this:
1 Like