Sign Up

Sign Up to our social questions and Answers Engine to ask questions, answer people’s questions, and connect with other people.

Have an account? Sign In

Have an account? Sign In Now

Sign In

Login to our social questions & Answers Engine to ask questions answer people’s questions & connect with other people.

Sign Up Here

Forgot Password?

Don't have account, Sign Up Here

Forgot Password

Lost your password? Please enter your email address. You will receive a link and will create a new password via email.

Have an account? Sign In Now

You must login to ask a question.

Forgot Password?

Need An Account, Sign Up Here

Please briefly explain why you feel this question should be reported.

Please briefly explain why you feel this answer should be reported.

Please briefly explain why you feel this user should be reported.

Sign InSign Up

The Archive Base

The Archive Base Logo The Archive Base Logo

The Archive Base Navigation

  • SEARCH
  • Home
  • About Us
  • Blog
  • Contact Us
Search
Ask A Question

Mobile menu

Close
Ask a Question
  • Home
  • Add group
  • Groups page
  • Feed
  • User Profile
  • Communities
  • Questions
    • New Questions
    • Trending Questions
    • Must read Questions
    • Hot Questions
  • Polls
  • Tags
  • Badges
  • Buy Points
  • Users
  • Help
  • Buy Theme
  • SEARCH
Home/ Questions/Q 7012521
In Process

The Archive Base Latest Questions

Editorial Team
  • 0
Editorial Team
Asked: May 27, 20262026-05-27T22:16:00+00:00 2026-05-27T22:16:00+00:00

Let’s say I have a data structure like the following: Camera { double x,

  • 0

Let’s say I have a data structure like the following:

Camera {
   double x, y, z

   /** ideally the camera angle is positioned to aim at the 0,0,0 point */
   double angleX, angleY, angleZ;
}

SomePointIn3DSpace {
   double x, y, z
}

ScreenData {
   /** Convert from some point 3d space to 2d space, end up with x, y */
   int x_screenPositionOfPt, y_screenPositionOfPt

   double zFar = 100;

   int width=640, height=480
}

…

Without screen clipping or much of anything else, how would I calculate the screen x,y position of some point given some 3d point in space. I want to project that 3d point onto the 2d screen.

Camera.x = 0
Camera.y = 10;
Camera.z = -10;


/** ideally, I want the camera to point at the ground at 3d space 0,0,0 */
Camera.angleX = ???;
Camera.angleY = ????
Camera.angleZ = ????;

SomePointIn3DSpace.x = 5;
SomePointIn3DSpace.y = 5;
SomePointIn3DSpace.z = 5;

ScreenData.x and y is the screen x position of the 3d point in space. How do I calculate those values?

I could possibly use the equations found here, but I don’t understand how the screen width/height comes into play. Also, I don’t understand in the wiki entry what is the viewer’s position vers the camera position.

http://en.wikipedia.org/wiki/3D_projection

  • 1 1 Answer
  • 0 Views
  • 0 Followers
  • 0
Share
  • Facebook
  • Report

Leave an answer
Cancel reply

You must login to add an answer.

Forgot Password?

Need An Account, Sign Up Here

1 Answer

  • Voted
  • Oldest
  • Recent
  • Random
  1. Editorial Team
    Editorial Team
    2026-05-27T22:16:00+00:00Added an answer on May 27, 2026 at 10:16 pm

    The ‘way it’s done’ is to use homogenous transformations and coordinates. You take a point in space and:

    • Position it relative to the camera using the model matrix.
    • Project it either orthographically or in perspective using the projection matrix.
    • Apply the viewport trnasformation to place it on the screen.

    This gets pretty vague, but I’ll try and cover the important bits and leave some of it to you. I assume you understand the basics of matrix math :).

    Homogenous Vectors, Points, Transformations

    In 3D, a homogenous point would be a column matrix of the form [x, y, z, 1]. The final component is ‘w’, a scaling factor, which for vectors is 0: this has the effect that you can’t translate vectors, which is mathematically correct. We won’t go there, we’re talking points.

    Homogenous transformations are 4×4 matrices, used because they allow translation to be represented as a matrix multiplication, rather than an addition, which is nice and quick for your videocard. Also convenient because we can represent successive transformations by multiplying them together. We apply transformations to points by performing transformation * point.

    There are 3 primary homogeneous transformations:

    • Translation,
    • Rotation, and
    • Scaling.

    There are others, notably the ‘look at’ transformation, which are worth exploring. However, I just wanted to give a brief list and a few links. Successive application of moving, scaling and rotating applied to points is collectively the model transformation matrix, and places them in the scene, relative to the camera. It’s important to realise what we’re doing is akin to moving objects around the camera, not the other way around.

    Orthographic and Perspective

    To transform from world coordinates into screen coordinates, you would first use a projection matrix, which commonly, come in two flavors:

    • Orthographic, commonly used for 2D and CAD.
    • Perspective, good for games and 3D environments.

    An orthographic projection matrix is constructed as follows:

    An orthographic projection matrix, courtesy of Wikipedia.

    Where parameters include:

    • Top: The Y coordinate of the top edge of visible space.
    • Bottom: The Y coordinate of the bottom edge of the visible space.
    • Left: The X coordinate of the left edge of the visible space.
    • Right: The X coordinate of the right edge of the visible space.

    I think that’s pretty simple. What you establish is an area of space that is going to appear on the screen, which you can clip against. It’s simple here, because the area of space visible is a rectangle. Clipping in perspective is more complicated because the area which appears on screen or the viewing volume, is a frustrum.

    If you’re having a hard time with the wikipedia on perspective projection, Here’s the code to build a suitable matrix, courtesy of geeks3D

    void BuildPerspProjMat(float *m, float fov, float aspect,
    float znear, float zfar)
    {
      float xymax = znear * tan(fov * PI_OVER_360);
      float ymin = -xymax;
      float xmin = -xymax;
    
      float width = xymax - xmin;
      float height = xymax - ymin;
    
      float depth = zfar - znear;
      float q = -(zfar + znear) / depth;
      float qn = -2 * (zfar * znear) / depth;
    
      float w = 2 * znear / width;
      w = w / aspect;
      float h = 2 * znear / height;
    
      m[0]  = w;
      m[1]  = 0;
      m[2]  = 0;
      m[3]  = 0;
    
      m[4]  = 0;
      m[5]  = h;
      m[6]  = 0;
      m[7]  = 0;
    
      m[8]  = 0;
      m[9]  = 0;
      m[10] = q;
      m[11] = -1;
    
      m[12] = 0;
      m[13] = 0;
      m[14] = qn;
      m[15] = 0;
    }
    

    Variables are:

    • fov: Field of view, pi/4 radians is a good value.
    • aspect: Ratio of height to width.
    • znear, zfar: used for clipping, I’ll ignore these.

    and the matrix generated is column major, indexed as follows in the above code:

    0   4   8  12
    1   5   9  13
    2   6  10  14
    3   7  11  15
    

    Viewport Transformation, Screen Coordinates

    Both of these transformations require another matrix matrix to put things in screen coordinates, called the viewport transformation. That’s described here, I won’t cover it (it’s dead simple).

    Thus, for a point p, we would:

    • Perform model transformation matrix * p, resulting in pm.
    • Perform projection matrix * pm, resulting in pp.
    • Clipping pp against the viewing volume.
    • Perform viewport transformation matrix * pp, resulting is ps: point on screen.

    Summary

    I hope that covers most of it. There are holes in the above and it’s vague in places, post any questions below. This subject is usually worthy of a whole chapter in a textbook, I’ve done my best to distill the process, hopefully to your advantage!

    I linked to this above, but I strongly suggest you read this, and download the binary. It’s an excellent tool to further your understanding of theses transformations and how it gets points on the screen:

    http://www.songho.ca/opengl/gl_transform.html

    As far as actual work, you’ll need to implement a 4×4 matrix class for homogeneous transformations as well as a homogeneous point class you can multiply against it to apply transformations (remember, [x, y, z, 1]). You’ll need to generate the transformations as described above and in the links. It’s not all that difficult once you understand the procedure. Best of luck :).

    • 0
    • Reply
    • Share
      Share
      • Share on Facebook
      • Share on Twitter
      • Share on LinkedIn
      • Share on WhatsApp
      • Report

Sidebar

Related Questions

Let's say I'm building a data access layer for an application. Typically I have
Let's say you have a class called Customer, which contains the following fields: UserName
Let's say I have a text file composed like this ##### typeofthread1 ##### typeofthread2
Let's say I have the following text: (example) <table> <tr> <td> <span>col1</span> </td> <td>col2</td>
Let's say I have the following object: var VariableName = { firstProperty: 1, secondProperty:
Let say I have the following desire, to simplify the IConvertible's to allow me
Let's say I have table with column 'URL' whrere I store urls like this
Let's say that I have a set of relations that looks like this: relations
Let's say I have the following function in C#: void ProcessResults() { using (FormProgress
Let's say that I have classes like this: public class Parent { public int

Explore

  • Home
  • Add group
  • Groups page
  • Communities
  • Questions
    • New Questions
    • Trending Questions
    • Must read Questions
    • Hot Questions
  • Polls
  • Tags
  • Badges
  • Users
  • Help
  • SEARCH

Footer

© 2021 The Archive Base. All Rights Reserved
With Love by The Archive Base

Insert/edit link

Enter the destination URL

Or link to existing content

    No search term specified. Showing recent items. Search or use up and down arrow keys to select an item.