Jump to content

Using Player::getIModelview or matrix transformations


photo

Recommended Posts

I have PlayerActor player, that have some "feeler" ahead, that can intersect objects, and player can move around himself with this objects. Also I need save offset between object's center and object's intersection with player.

First of all I try realize it via adding object into player's children list, but this pattern is not suitable:

1. When PlayerActor turning left/right then children nodes transform with it, but if it move up/down, then rotated camera inside of player, and children not transform.

2. I will use physical forces in future, so I would like keep player and object in one hierarchical level.

Problem described on screenshot:

post-151-0-91705700-1301315675_thumb.jpg

Next realization was via objects position:

I save vector via player's camera position and gived object:

v = intersectionPos - actorPos; // vector via intersection position and plyer camera position
centerOffset = objectPos - intersectionPos; // vector via object center and intersection position

Then in update method I use next:

mat4 objectModelview = translate(actorPos);

mat4 t = translate(v);

objectModelview = objectModelview * t * translate(centerOffset);

vec3 p2 = objectModelview.m03m13m23; // position of destination point

But this variant not take into account player's rotation.

I try to use for this matrix lookAt:

vec3 actorPos = actor.getIModelview().m03m13m23;
mat4 objectModelview = lookAt(actorPos, // actor's camera position
actorFeelerPos, // actor's feeler position (ahead the actor)
actor.getUp() // actor's up vector
);

mat4 t = translate(v);

objectModelview = objectModelview * t * translate(centerOffset);

vec3 p2 = objectModelview.m03m13m23; // position of destination point

And try to use IModelview:

mat4 objectModelview = actor.getIModelview();

mat4 t = translate(v);

objectModelview = objectModelview * t * translate(centerOffset);

vec3 p2 = objectModelview.m03m13m23; // position of destination point

 

And all this patterns give me different results... I think best variant to use IModelview or maybe Modelview matrices, but when I use it, line objectModelview = objectModelview * t; give me different variants even for different angles between player and object... It seems like this matrix have different coordinate system than world transformations or I have errors in some else (

Link to comment

I do additional tests:

If I use next code:

engine.visualizer.renderSolidSphere(actor.getIModelview() * ::translate(vec3(0, 0, -1)), 0.1, vec4(1, 0, 0, 1));

I have necessary effect - I see sphere in front of player's camera.

But when I calculate vector from player's camera to intersection point with object, I have, for example, next vector: (1.18, 0.12, -0.13), in this case object placed in front of camera too, but vector axis distance moved from Z to X:

vec3(0,    0,    -1) // vector with right direction for objects in front of player's camera
vec3(1.18, 0.12, -0.13) // calculated vector, described distance from player's camera to object in front of it, have different axis and sign

What I doing wrong? I think I'm doing all calculations in different transformation spaces or something about it.

Link to comment
×
×
  • Create New...