opengl es - iPhone : Moving in 3D Space (stepping sideways using gluLookAt) -
opengl es - iPhone : Moving in 3D Space (stepping sideways using gluLookAt) -
i have written 3d environment in opengl can move forward/backwards , around (up/down left/right) cant work out how can side step left of right.
i using glulookat , moving forwards code is
glfloat v[] = {[self centeratindex:0] - [self eyeatindex:0],[self centeratindex:1] - [self eyeatindex:1], [self centeratindex:2] - [self eyeatindex:2]}; [self seteye:[self eyeatindex:0] + v[0] * speed_move atindex:0]; [self seteye:[self eyeatindex:2] + v[2] * speed_move atindex:2]; [self setcenter: [self centeratindex:0] + v[0] * speed_move atindex:0]; [self setcenter: [self centeratindex:2] + v[2] * speed_move atindex:2];
and
glulookat(eye[0], eye[1], eye[2],center[0], center[1], center[2], 0.0, 1, 0.0);
anyone got thought how side step or seen example?
solution
float up[3] = {0, 1, 0}; float forward[3] = { center[0] - eye[0],center[1] - eye[1],center[2] - eye[2] }; float left[3]; left[0] = forward[1] * up[2] - forward[2] * up[1]; left[1] = forward[2] * up[0] - forward[0] * up[2]; left[2] = forward[0] * up[1] - forward[1] * up[0]; // translate eye position [self seteye:[self eyeatindex:0] - left[0] * speed_move atindex:0]; [self seteye:[self eyeatindex:2] - left[2] * speed_move atindex:2]; [self setcenter: [self centeratindex:0] - left[0] * speed_move atindex:0]; [self setcenter: [self centeratindex:2] - left[2] * speed_move atindex:2]; if (([self eyeatindex:2] >= mapsizez || [self eyeatindex:0] >= mapsizex || [self eyeatindex:2] <= 1 || [self eyeatindex:0] <= 1) || [self checkcollisionwithpoint:cgpointmake([self eyeatindex:0] ,[self eyeatindex:2])] ){ [self seteye:[self eyeatindex:0] + left[0] * speed_move atindex:0]; [self seteye:[self eyeatindex:2] + left[2] * speed_move atindex:2]; [self setcenter: [self centeratindex:0] + left[0] * speed_move atindex:0]; [self setcenter: [self centeratindex:2] + left[2] * speed_move atindex:2]; }
to move sideways have translate eye position along camera's right vector.
to find right vector, remember cross product of 2 vectors gives perpendicular vector. so, cross product of forwards vector , vector give right vector.
your forwards vector v[3], utilize 'forward' here clarity.
// find right vector. (forward cross product up) float right[3]; right[0] = forward[1] * up[2] - forward[2] * up[1]; right[1] = forward[2] * up[0] - forward[0] * up[2]; right[2] = forward[0] * up[1] - forward[1] * up[0]; // translate eye position [self seteye:[self eyeatindex:0] + right[0] * speed_move atindex:0]; [self seteye:[self eyeatindex:2] + right[2] * speed_move atindex:2];
you should note glu library not available opengl es, have reimplement lookat function, straightforward, question.
iphone opengl-es 3d
Comments
Post a Comment