Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

Three.js cube face rotation vector in relation to camera

I have a rotating sphere on which I have a div attached the example can be viewed here: https://jsfiddle.net/ao5wdm04/ I calculate the x and y values and place the div using a translate3d transform and that works quite well.

My question is how to can get the values for the rotateX, rotateY and rotateZ or rotate3d transforms so the div "tangents" the sphere surface. I know the cube mesh faces the sphere center so I assume the rotation vector of the outward facing normal vector in relation to the camera would contain the values I need. But I'm not quite sure how to obtain these.

Update

By using Euler angles I'm almost achieving the desired effect, shown here: https://jsfiddle.net/ao5wdm04/1/ but the rotation is not large enough.

like image 274
Andreas Jarbol Avatar asked Feb 29 '16 17:02

Andreas Jarbol


1 Answers

Disclaimer: I know nothing about three.js. I've just done a bit of OpenGL.

Your euler angles are coming from a model-view-projected origin (lines 74-80). I can't see the logic behind this.

If your div is on the sphere surface, then it should be oriented by the normal of the sphere at the location of the div. Fortunately, you already have these angles. They are named rotation.

If you replace the euler angles in lines 82-84 with the rotation angles used to position the div, then in my browser the div appears edge on when it is at the edge of the circle, and face on when it is at the centre. It kind of looks like it is moving in a circle, edge on to the screen. Is this the effect you want?

My modification to the linked code:

82 var rotX = (rotation.x * (180/ Math.PI));
83 var rotY = (rotation.y * (180/ Math.PI));
84 var rotZ = 0;

EDIT

Ah, ok. The rotation variable is just that of the camera. It governs the tangent at the equator. You also need to modify the orientation to account for latitude.

Make rotY equal to negative your latitude. Then make sure that this rotation happens before the equatorial rotation. Rotations are not commutative.

In summary, changes from the code at https://jsfiddle.net/ao5wdm04/1/ are as follows:

27 var lat = 45 * Math.PI / 180;
...
82 var rotX = (rotation.x * (180/ Math.PI));
83 var rotY = - 45;
...
88 document.getElementById('face').style.webkitTransform = 'translate3d(' + x + 'px,' + y + 'px,0px) rotateY('+rotX+'deg) rotateX('+rotY+'deg)';

I don't know how the latitude should propagate between the init and render functions. As I said, I'm not familiar with the language.

like image 61
Bill Avatar answered Oct 01 '22 10:10

Bill