Jump to content
  • Advertisement
Sign in to follow this  
wlw_wl

perspective transformation failing

This topic is 3510 days old which is more than the 365 day threshold we allow for new replies. Please post a new topic.

If you intended to correct an error in the post then please contact us.

Recommended Posts

Hello, I've implemented glPerspective and glLookAt, however I can't get the former to work. Some explanation first: I'm not using stacks, instead I just have two global matrices, ViewMatrix (serves as projection stack) and WorldMatrix (as model view stack). Both initialize with identity, and then i.e. calling LookAt multiplies ViewMatrix by appropriate matrix. So the pipeline looks like this: take vertex P, multiply it by WorldMAtrix, then by ViewMatrix. This should give screen x and y coordinates to draw the pixel. While wLookAt seems to be working fine (I tested it with some false 3d to 2d projection), the wPerspective won't. Here's the code (I don't know how to make those code snippets...): void wLookAt(double eyex, double eyey, double eyez, double centerx, double centery, double centerz, Vec3 up) { Vec3 forward(0.0, 0.0, 0.0), side(0.0, 0.0, 0.0), _up(up); Mat4x4 m; // temp matrix m.identity(); forward.x = centerx - eyex; forward.y = centery - eyey; forward.z = centerz - eyez; normalizeSelf(forward); // just normalizes a vector side = cross(forward, _up); normalizeSelf(side); _up = cross(side, forward); m.m[0][0] = side.x; m.m[1][0] = side.y; m.m[2][0] = side.z; m.m[0][1] = -_up.x; // "-" because objects got drawn upside-down m.m[1][1] = -_up.y; m.m[2][1] = -_up.z; m.m[0][2] = -forward.x; m.m[1][2] = -forward.y; m.m[2][2] = -forward.z; //ViewMatrix = m * ViewMatrix; ViewMatrix *= m; ViewMatrix.translate(-eyex, -eyey, -eyez); } and the other one: void wPerspective(double fovy, double aspect, double znear, double zfar) { double fovy_rad = fovy * 0.017453292519943; // degs to radians double yScale = -1/tan(fovy_rad/2.0); // -cot(fovy_rad/2), yet again "-" because of up-down double xScale = yScale / aspect; Mat4x4 m; // temp matrix m.zero(); m.m[0][0] = xScale; m.m[1][1] = yScale; m.m[2][2] = zfar/(znear-zfar); m.m[3][2] = znear*zfar/(znear-zfar); m.m[2][3] = -1; ViewMatrix = m * ViewMatrix; //ViewMatrix *= m; } and after calling in drawin loop WorldMatrix.loadIdentity(); ViewMatrix.loadIdentity(); Vec3 up(0.0, 1.0, 0.0); wLookAt(0.0, 0.0, -3.0, 0.0, 0.0, 0.0, up); // drawing area is 800x600 wPerspective(45.0, (double)(4.0/3.0), 0.0, 100.0); and Flushing*, I get some weird coordinates which cause app to terminate - negative coordinates in a very first frame, which shouldn't happen as theo nly one object in the scene is set up at the origin and 1 unit big. *) maybe I did this wrong? for each vertex flushing does this: //(d is some vertex in 3d space with Lx, Ly, Lz (L for it's local) coords Vec3 A; A = Vec3(d->Lx, d->Ly, d->Lz) * WorldMatrix; A *= ViewMatrix; //and (try to) draw pixel at (A.x, A.y); - FAIL Please, if you have a clue but need more of the code, say it. I didn't want to paste all at once because it would be unreadable...

Share this post


Link to post
Share on other sites
Advertisement
Sign in to follow this  

  • Advertisement
×

Important Information

By using GameDev.net, you agree to our community Guidelines, Terms of Use, and Privacy Policy.

Participate in the game development conversation and more when you create an account on GameDev.net!

Sign me up!