Problem with CCCamera->setEyeXYZ ()

Hi, first, sorry for my bad english.

I’m using “CCCamera->setEyeXYZ ()” for doing a pseudo-3d perspective.
The problem come when I try to position objects in this place.
How I can turn a screen point to its equivalent in the pseudo-3d perspective?

Example:
In “eyexyz.png”, the sprite without setEyeXYZ () effect.
In “eyexyz2.png” with the setEyeXYZ (x,–0.0000001f,z) pseudo-3d effect.

I need the algorithm to calculate the position of any point inside the texture.
The upper left corner is (0,149) (anchor [0,1]).
In the perspective this point is (61,126).

I’ve tried a lot of things, but none solved the problem.

Please, help!


eyexyz.png (7.2 KB)


eyexyz2.png (14.3 KB)

Using GluLookat code:

void Transform(float &xx, float &yy, float &zz,  // Coordinates to transform
    float fEyeX, float fEyeY, float fEyeZ, // lookAtXYZ
    float fCenterX, float fCenterY, float fCenterZ,
    float fUpX, float fUpY, float fUpZ)
{

    GLfloat x[3], y[3], z[3];
    GLfloat mag;
    // Make rotation matrix
    // Z vector
    z[0] = fEyeX - fCenterX;
    z[1] = fEyeY - fCenterY;
    z[2] = fEyeZ - fCenterZ;
    mag = (float)sqrtf(z[0] * z[0] + z[1] * z[1] + z[2] * z[2]);
    if (mag) {
        z[0] /= mag;
        z[1] /= mag;
        z[2] /= mag;
    }
    // Y vector
    y[0] = fUpX;
    y[1] = fUpY;
    y[2] = fUpZ;
    // X vector = Y cross Z
    x[0] = y[1] * z[2] - y[2] * z[1];
    x[1] = -y[0] * z[2] + y[2] * z[0];
    x[2] = y[0] * z[1] - y[1] * z[0];
    // Recompute Y = Z cross X
    y[0] = z[1] * x[2] - z[2] * x[1];
    y[1] = -z[0] * x[2] + z[2] * x[0];
    y[2] = z[0] * x[1] - z[1] * x[0];
    /* cross product gives area of parallelogram, which is < 1.0 for
    * non-perpendicular unit-length vectors; so normalize x, y here
    */
    mag = (float)sqrtf(x[0] * x[0] + x[1] * x[1] + x[2] * x[2]);
    if (mag) {
        x[0] /= mag;
        x[1] /= mag;
        x[2] /= mag;
    }
    mag = (float)sqrtf(y[0] * y[0] + y[1] * y[1] + y[2] * y[2]);
    if (mag) {
        y[0] /= mag;
        y[1] /= mag;
        y[2] /= mag;
    }
    // Now, calculate the new coordinates...
    GLfloat cX = x[0]*xx + x[1]*yy + x[2]*zz;
    GLfloat cY = y[0]*xx + y[1]*yy + y[2]*zz;
    GLfloat cZ = z[0]*xx + z[1]*yy + z[2]*zz;
    // This coordinates must be converted to 2D
    // Xn = Xvcenter + (Xe/Ze · Vwidth)/(2·tan(θ/2))
    // Yn = Yvcenter + (Ye/Ze · Vheight)/(2·tan(θ/2)) 
    // TODO
    float t1 = 1.5488305 * 2.f; // Inverse calculated
    float t = tan (t1 / 2.f);
    float angle = 2.f * t; 
    xx = (0.f / 2.f) + ((cX/cZ) * 480.f)/angle;
    yy = (0.f / 2.f) + ((cY/cZ) * 320.f)/angle; 
}

What angle is θ???

I’ve tried inverse calculation, but when this angle works for “xx” is wrong to “yy”.
Maybe there are others errors…

Help, please!

The best solution is use GluProject () sources

:slight_smile:

Hey,
Sorry to resurrect an old thread -
glad you found a solution,

im in the exact same problem, mind sharing what to do with gluproject?
Thanks,
Dan