iDevGames Forums
Weird "stretching" object - Printable Version

+- iDevGames Forums (http://www.idevgames.com/forums)
+-- Forum: Development Zone (/forum-3.html)
+--- Forum: Graphics & Audio Programming (/forum-9.html)
+--- Thread: Weird "stretching" object (/thread-3240.html)



Weird "stretching" object - anthony - Jun 13, 2007 10:44 AM

Hi,

I am rendering a falling cube (it's from an ODE simulation), but for some weird reason the cube appears to "stretch", actually it looks like it gets longer. I don't have an exact value but say, it's 1 x 10 x 1 (width, height, length) as it falls and then shrinks too it's normal size 1 x 1 x 1.

Falling: [Image: f_Picture1m_0e0e58d.png]

Proper size, once landed:
[Image: f_Picture3m_423cdef.png]

(the small white square is just something i put in to mark the floor)

I've checked the dimensions as it falls and they don't change.

I've tried clearing all the buffers just in case the "stretch" is actually caused by a buffer not clearing properly but that hasn't made a difference.

Does anyone have any ideas as to what might be causing the problem?


Weird "stretching" object - longjumper - Jun 13, 2007 10:55 AM

Are you continually multiplying the transformation matrix as the frames go on?

All of your drawing code posted may help...


Weird "stretching" object - anthony - Jun 13, 2007 11:55 AM

The way I'm drawing the cube is:

1. Get its position in the ODE world (x, y and z)
2. Get its rotational matrix from ODE and converting it to be an OpenGL matrix
3. I translate the cube using its x, y and z
4. And then glMultMatrixf () the rotational matrix


I've pasted in the code below:

Code:
// the update...
Vector3 posn = odeWorld->GetPosition(cubert.getVisual(0).geom);
const dReal *rot = odeWorld->GetRotation(cubert.getVisual(0).geom);
cubert.SetPosition(posn.GetX(), posn.GetY(), posn.GetZ());
cubert.ConvertMatrix(rot);
cubert.Render();

The Render() function. ODE coordinates are defined as the centre of the object's body so I've altered them to draw the cube correctly in OpenGL.

I'm not sure if I'm using glTranslatef() correctly, but my reasoning was that I could draw the cube using a display list, I just haven't gotten around to it yet.

Code:
...
        ...
        float width  = GetWidth();
    float height = GetHeight();
    float length = GetLength();
    // top left coordinate of the geometry
    float x = GetX() - (width / 2.0f);
    float y = GetY() + (height / 2.0f);
    float z = GetZ() - (length / 2.0f);

    glPushMatrix();
    glTranslatef(x, y, z);
    glMultMatrixf(rotMatrix);
    glBegin(GL_QUADS);        // Start Drawing The Cube
        // RED
        glColor3f(1.0f, 0.0f, 0.0f);
        // back wall
        glVertex3f(width, y, z);            // top right
        glVertex3f(x, y, z);                // top left
        glVertex3f(x, -height, z);        // bottom left
        glVertex3f(width, -height, z);    // bottom right
        
        // front wall
        glVertex3f(width, y, length);            // top right
        glVertex3f(x, y, length);                // top left
        glVertex3f(x, -height, length);        // bottom left
        glVertex3f(width, -height, length);    // bottom right
        
        // "floor"
        glVertex3f(width, -height, z);            // top right
        glVertex3f(x, -height, z);                // top left
        glVertex3f(x, -height, length);        // bottom left
        glVertex3f(width, -height, length);    // bottom right
        
        // "roof"
        glVertex3f(width, y, z);            // top right
        glVertex3f(x, y, z);                // top left
        glVertex3f(x, y, length);            // bottom left
        glVertex3f(width, y, length);        // bottom right
        
        // left wall
        glVertex3f(x, y, z);                // top right
        glVertex3f(x, y, length);            // top left
        glVertex3f(x, -height, length);    // bottom left
        glVertex3f(x, -height, z);            // bottom right
        
        // right wall
        glVertex3f(width, y, z);                // top right
        glVertex3f(width, y, length);            // top left
        glVertex3f(width, -height, length);    // bottom left
        glVertex3f(width, -height, z);            // bottom right
        
    glEnd();
    glPopMatrix();
}

It's melting my face at the moment, I think I spent a bit too long at it today. I might have bitten off more than I can chew with the 3D graphics but this is the first time I've had a problem like this.


Weird "stretching" object - anthony - Jun 13, 2007 12:00 PM

Fixed it!

The mistake I was making was that I was using the altered x, y and z as the drawing coordinates and _still_ translating - bah! Blush

Thanks LongJumper, if you hadn't asked for my drawing code I'd probably not have copped the problem at all! Smile


Weird "stretching" object - longjumper - Jun 14, 2007 10:59 AM

Uhhh, glad I could help? Rasp Your API should be able to spit out an entire transformation matrix which contains the rotation + translation for one smooth glMultMatrix call instead of translate/mult. Not that it matters a whole lot.