Hi!
I tried to convert the vertices from world coordinates to frustum coordinates by doing this in AbstractCamera:
public Vector3f getFrustumCoordinates( Vector3f worldPosition, Vector3f store ) {
if ( store == null ) {
store = new Vector3f();
}
checkViewProjection();
tmp_quat.set( worldPosition.x, worldPosition.y, worldPosition.z, 1 );
modelViewProjection.mult( tmp_quat, tmp_quat );
tmp_quat.multLocal( 1.0f / tmp_quat.w );
store.x = tmp_quat.x;
store.y = tmp_quat.y;
store.z = tmp_quat.z;
return store;
}
In my case, frustumLeft = -0.1, frustumRight = 0.1, viewportLeft = 0 and viewportRight = 1. When I call this method on vertices that are inside the view frustum, I should get some abscissa between -0.1 and 0.1, shouldn't I? Why do I get abscissa between -1 and 1 instead?
* @author Mark Powell
* @author Joshua Slack
Your help would be appreciated please :'(
I have found the answer alone and I'm going to explain to you what I understand as it might help anyone here one day. The source code below inspired me to write my method:
public Vector3f getScreenCoordinates( Vector3f worldPosition, Vector3f store ) {
if ( store == null ) {
store = new Vector3f();
}
checkViewProjection();
tmp_quat.set( worldPosition.x, worldPosition.y, worldPosition.z, 1 );
modelViewProjection.mult( tmp_quat, tmp_quat );
tmp_quat.multLocal( 1.0f / tmp_quat.w );
store.x = ( ( tmp_quat.x + 1 ) * ( viewPortRight - viewPortLeft ) / 2 ) * getWidth();
store.y = ( ( tmp_quat.y + 1 ) * ( viewPortTop - viewPortBottom ) / 2 ) * getHeight();
store.z = ( tmp_quat.z + 1 ) / 2;
return store;
}
The author does ( ( tmp_quat.x + 1 ) * ( viewPortRight - viewPortLeft ) / 2 ) in order to go from the normalized device coordinates to window coordinates. The normalized device coordinates go from -1 to 1 (if the vertex is inside the window). +1 allows to go from 0 and 2. By default, multiplying by ( viewPortRight - viewPortLeft ) / 2 allows to go from 0 and 1. The last step allows to go from 0 and "width".
Then I have to do:
store.x = ( ( ( tmp_quat.x + 1 ) * ( frustumRight - frustumLeft ) / 2 ) ) + frustumLeft;
:D
Finally, I don't understand why we don't do "+ viewPortLeft" in the method getScreenCoordinates(...).