Part of the Khronos Group
OpenGL.org

The Industry's Foundation for High Performance Graphics

from games to virtual reality, mobile phones to supercomputers

Results 1 to 8 of 8

Thread: Screen Position Calculations - Help Needed

  1. #1
    Newbie Newbie
    Join Date
    Apr 2018
    Posts
    1

    Screen Position Calculations - Help Needed

    Hello guys,

    I've got three values (angles) - x and y that camera is facing (yaw and pitch, and z if needed), these are:

    x - heading from true north in OGL coordinates
    y - pitch from flat in OGL coordinates

    I am wondering if it is possible by using these values to get Screen Position as a vector of xy?

    Also, if we have a pitch value from flat Surface, would it be possible to recalculate pitch if camera moves up? If yes, how?

    Sorry for asking for help but I am new to OpenGL and desperatly in need of advice.

    Best Regards,
    Michal

  2. #2
    Intern Newbie
    Join Date
    Apr 2018
    Posts
    44
    so everyone just left this guy for 12 days, I should start a school.
    I'm going to teach you everything in one minute !!!!!!!

    if you dont want everything, then dont get my example files and dont learn everything,
    -== WORLD-3dpnt to SCREEN ==-

    void w2s(int xy[2],int fol,double v[3],int x,int y) {
    xy[0] = (int)((fol/v[2])*v[0]+x);
    xy[1] = (int)((fol/v[2])*v[1]+y);
    }


    orbital(cameye,3); // .pos has no obliquity. remember
    NORMALIZE(cameye); /// required for dotproduct ANGLE(v,v2)
    /// crossproduct tho, is always a right angle vector,
    /// normal input not needed, normalize crossproduct result.
    set16mat(cmatrix,cameye); /// normal input not required
    INITVECTOR(camup,cmatrix[4],cmatrix[5],cmatrix[6]);///a normal in the matrix
    /// ////////////////// LookAt transform
    if(invertmatrix(cmatrix,wmatrix))
    /// now begin loop on every point
    SUBV(anyPoint,anyPoint,campos);
    popmatrix(v,wmatrix,anyPoint);
    if Z is positive infront of camera, draw it, clip out xy limits
    draw at w2s(f,v) <x y

  3. #3
    Intern Newbie
    Join Date
    Apr 2018
    Posts
    44
    one of these days I might change fol from int to double for more precise adjustments
    now needed in OGL @ 200 fps, awesome !!!

    first examples in main, is the trig - focal length to field of view.

    know the trig laws and right-angle rules

    3D 101, heh

  4. #4
    Intern Newbie
    Join Date
    Apr 2018
    Posts
    44
    and here's the working prototype almost as described -

    without more testing, I just figure its reversed for leaving ortho2D with 0 at bottom

    http://trueinnerbeing.x10host.com/code/scrcap2.png

    uses inverted gluLookAt, and gluPerspective with input of fov/2

  5. #5
    Intern Newbie
    Join Date
    Apr 2018
    Posts
    44
    Update, after sizing the window I realize, ooops

    gluPerspective(CLAMP(fov/Aspect,0.001,170.0)

    I knew 2 was only close but what? it was aspect

  6. #6
    Intern Newbie
    Join Date
    Apr 2018
    Posts
    44
    ok then - beginners will likely begin wrong if they dont have this...

    BG stars lights camera scene text = the math that IS the Camera!
    http://trueinnerbeing.x10host.com/code/code.html

    Worth taking an hour to Google and make high def tga textures and running as eyeCandy.
    Improvements very welcome, appreciated and worthwhile - chk it out -

    ITS BIGGER
    ITS BADDER
    ITS BETTER

    how much does anti Aliasing COST? lol

  7. #7
    Intern Newbie
    Join Date
    Apr 2018
    Posts
    44
    Latest Features:
    Gravity Simulation: c
    Focal len and user defined star size: S,s
    Random StarGate. Warps to the stars: 5
    StarGate: 6
    http://trueinnerbeing.x10host.com/code/code.html
    this code answers many questions - got know at least this much about the matrix.
    not exactly a newbie - misnomer, hah

  8. #8
    Intern Newbie
    Join Date
    Apr 2018
    Posts
    44
    took a while, but finally got around to matching perspective screen xy !!
    ... simple, use the same perspective matrix you gave to the projection matrix.
    found the deprecated glulookAt and gluPerspective code, especially lookat was ugly - rewritten.

    working example **********************************
    ('cause no one else knew how, someone had to do it.)
    functions not included, are in the file.

    Code cpp:
    #define NORMALIZE4(V) {  \
      V[0]/=V[3];  \
      V[1]/=V[3];   \
      V[2]/=V[3];   \
    }
     
    #define popmatrix4( U, M, V ) { \
    U[0] = V[0]*M[0]+V[1]*M[4]+V[2]*M[8]+V[3]*M[12]; \
    U[1] = V[0]*M[1]+V[1]*M[5]+V[2]*M[9]+V[3]*M[13];  \
    U[2] = V[0]*M[2]+V[1]*M[6]+V[2]*M[10]+V[3]*M[14];  \
    U[3] = V[0]*M[3]+V[1]*M[7]+V[2]*M[11]+V[3]*M[15];  \
    if (U[3]) NORMALIZE4(U); \
    } /// != 0.0)&& (U[3] != 1) 1 changes nothing, NOT 0
     
    double pmat[16] = { 0,0,0,0,0,0,0,0,0,0,0,-1,0,0,0,0 } ;
     
    void setpmat() {
      double fl; // = tan(dtor(90-fovx/aspect/2)); /// UNIT focal len
      fl = 1/tan(dtor(fov/Aspect/2)); ///  same number  /// fl * cx = actual focal length
      pmat[0]  = fl/Aspect;
      pmat[5]  = fl;
      pmat[10] = (farclip + nearclip) / (nearclip - farclip);
      pmat[14] = 2*farclip*nearclip / (nearclip - farclip);
    }
     
    void fovmat(double v[],double p[]) {
        int cx = (int)(_Width/2),cy = (int)(_Height/2);
        double pnt2[4], pnt[4] = { 0,0,0,1 } ;
        COPYVECTOR(pnt,p);NORMALIZE(pnt); /// matrix in unit form, normalize
        popmatrix4(pnt2,pmat,pnt);
        COPYVECTOR(v,pnt2);
        v[0] *= -cx; v[1] *= -cy;
        v[0] += cx; v[1] += cy;
    }

    In the gl scheme,

    Code cpp:
      glMatrixMode(GL_PROJECTION);
      glLoadIdentity();
      glMultMatrixd(pmat); //perspective
      glMatrixMode(GL_MODELVIEW);
      glLoadIdentity();
      Camera(); // invertmatrix()

    And for 2D - a 3D radius to 2D screen points.
    first invert cam matrix to world wmatrix -
    apply perspective to points in front.

    Code cpp:
        SUBV(v,v,campos);
        if (VLEN(v) < farclip) {
        popmatrix(v2,wmatrix,v);
        if (v2[2] < 0.0) { /// reversed
        fovmat(v,v2); // FIN
     
    // label down one radius
        INITVECTOR(w,0,elem[i].radius,0);
        ADDV(w,w,v2);
        fovmat(v2,w);
        SUBV2(v2,v2,v);
        sub = 10 + (int)VLEN2(v2);
    printstring(v[0],v[1]-sub,0.0,elem[i].name,3);
    // not some 3d point bouncing around dependent on z roll
    // sticks like glue at any fov angle.
     
    //or return a perspective size for an image -- fsize(1,12);
    double fsize(double x, double z) { // Z focal len
      double v[3], p[3] = { x,0,z } ;
      fovmat(v,p);
      return v[0] - _Width / 2;
    }
    Last edited by Dark Photon; 09-28-2018 at 05:48 AM.

Posting Permissions

  • You may not post new threads
  • You may not post replies
  • You may not post attachments
  • You may not edit your posts
  •