• Advertisement
Sign in to follow this  

Matrix operations in LWJGL, odd coordinate problems

This topic is 1897 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

Hi fellow coders,

I'm having real issues with identifying the 'player' position in 3D space in relation to other objects in the world.

In the render pass, this happens:

[source lang="java"]
public void render()
{
float halfBlock = BLOCKSIZE / 2f;
float originX = (position.x * BLOCKSIZE) - halfBlock;
float originY = (position.y * BLOCKSIZE) - halfBlock;
float originZ = (position.z * BLOCKSIZE) - halfBlock;

glPushMatrix();

// bind the sides texture
texForSides.bind();
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_NEAREST);
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_NEAREST);

glBegin(GL_QUADS);

// back face
glColor3f(lightBack, lightBack, lightBack);
glTexCoord2d(1, 0);
glVertex3f(originX, originY + BLOCKSIZE, originZ);
glTexCoord2d(0, 0);
glVertex3f(originX + BLOCKSIZE, originY + BLOCKSIZE, originZ);
glTexCoord2d(0, 1);
glVertex3f(originX + BLOCKSIZE, originY, originZ);
glTexCoord2d(1, 1);
glVertex3f(originX, originY, originZ);

// front face
glColor3f(lightFront, lightFront, lightFront);
glTexCoord2d(0, 1);
glVertex3f(originX, originY, originZ + BLOCKSIZE);
glTexCoord2d(1, 1);
glVertex3f(originX + BLOCKSIZE, originY, originZ + BLOCKSIZE);
glTexCoord2d(1, 0);
glVertex3f(originX + BLOCKSIZE, originY + BLOCKSIZE, originZ + BLOCKSIZE);
glTexCoord2d(0, 0);
glVertex3f(originX, originY + BLOCKSIZE, originZ + BLOCKSIZE);

// left face
glColor3f(lightLeft, lightLeft, lightLeft);
glTexCoord2d(1, 1);
glVertex3f(originX, originY, originZ + BLOCKSIZE);
glTexCoord2d(1, 0);
glVertex3f(originX, originY + BLOCKSIZE, originZ + BLOCKSIZE);
glTexCoord2d(0, 0);
glVertex3f(originX, originY + BLOCKSIZE, originZ);
glTexCoord2d(0, 1);
glVertex3f(originX, originY, originZ);

// right face
glColor3f(lightRight, lightRight, lightRight);
glTexCoord2d(1, 1);
glVertex3f(originX + BLOCKSIZE, originY, originZ);
glTexCoord2d(1, 0);
glVertex3f(originX + BLOCKSIZE, originY + BLOCKSIZE, originZ);
glTexCoord2d(0, 0);
glVertex3f(originX + BLOCKSIZE, originY + BLOCKSIZE, originZ + BLOCKSIZE);
glTexCoord2d(0, 1);
glVertex3f(originX + BLOCKSIZE, originY, originZ + BLOCKSIZE);

glEnd();


// bind the top texture
texForBottom.bind();
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_NEAREST);
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_NEAREST);

glBegin(GL_QUADS);

// bottom face
glColor3f(lightBottom, lightBottom, lightBottom);
glTexCoord2d(0, 0);
glVertex3f(originX + BLOCKSIZE, originY, originZ);
glTexCoord2d(1, 0);
glVertex3f(originX + BLOCKSIZE, originY, originZ + BLOCKSIZE);
glTexCoord2d(1, 1);
glVertex3f(originX, originY, originZ + BLOCKSIZE);
glTexCoord2d(0, 1);
glVertex3f(originX, originY, originZ);

glEnd();

// bind the bottom texture
texForTop.bind();

glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_NEAREST);
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_NEAREST);

glBegin(GL_QUADS);

// top face
glColor3f(lightTop, lightTop, lightTop);
glTexCoord2d(0, 0);
glVertex3f(originX, originY + BLOCKSIZE, originZ);
glTexCoord2d(1, 0);
glVertex3f(originX, originY + BLOCKSIZE, originZ + BLOCKSIZE);
glTexCoord2d(1, 1);
glVertex3f(originX + BLOCKSIZE, originY + BLOCKSIZE, originZ + BLOCKSIZE);
glTexCoord2d(0, 1);
glVertex3f(originX + BLOCKSIZE, originY + BLOCKSIZE, originZ);
glEnd();

glPopMatrix();

}
[/source]

The following shows the code that renders a block into the world:

[source lang="java"]
public void render()
{
float halfBlock = BLOCKSIZE / 2f;
float originX = (position.x * BLOCKSIZE) - halfBlock;
float originY = (position.y * BLOCKSIZE) - halfBlock;
float originZ = (position.z * BLOCKSIZE) - halfBlock;

glPushMatrix();

// bind the sides texture
texForSides.bind();
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_NEAREST);
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_NEAREST);

glBegin(GL_QUADS);

// back face
glColor3f(lightBack, lightBack, lightBack);
glTexCoord2d(1, 0);
glVertex3f(originX, originY + BLOCKSIZE, originZ);
glTexCoord2d(0, 0);
glVertex3f(originX + BLOCKSIZE, originY + BLOCKSIZE, originZ);
glTexCoord2d(0, 1);
glVertex3f(originX + BLOCKSIZE, originY, originZ);
glTexCoord2d(1, 1);
glVertex3f(originX, originY, originZ);

// front face
glColor3f(lightFront, lightFront, lightFront);
glTexCoord2d(0, 1);
glVertex3f(originX, originY, originZ + BLOCKSIZE);
glTexCoord2d(1, 1);
glVertex3f(originX + BLOCKSIZE, originY, originZ + BLOCKSIZE);
glTexCoord2d(1, 0);
glVertex3f(originX + BLOCKSIZE, originY + BLOCKSIZE, originZ + BLOCKSIZE);
glTexCoord2d(0, 0);
glVertex3f(originX, originY + BLOCKSIZE, originZ + BLOCKSIZE);

// left face
glColor3f(lightLeft, lightLeft, lightLeft);
glTexCoord2d(1, 1);
glVertex3f(originX, originY, originZ + BLOCKSIZE);
glTexCoord2d(1, 0);
glVertex3f(originX, originY + BLOCKSIZE, originZ + BLOCKSIZE);
glTexCoord2d(0, 0);
glVertex3f(originX, originY + BLOCKSIZE, originZ);
glTexCoord2d(0, 1);
glVertex3f(originX, originY, originZ);

// right face
glColor3f(lightRight, lightRight, lightRight);
glTexCoord2d(1, 1);
glVertex3f(originX + BLOCKSIZE, originY, originZ);
glTexCoord2d(1, 0);
glVertex3f(originX + BLOCKSIZE, originY + BLOCKSIZE, originZ);
glTexCoord2d(0, 0);
glVertex3f(originX + BLOCKSIZE, originY + BLOCKSIZE, originZ + BLOCKSIZE);
glTexCoord2d(0, 1);
glVertex3f(originX + BLOCKSIZE, originY, originZ + BLOCKSIZE);

glEnd();
// bind the top texture
texForBottom.bind();
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_NEAREST);
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_NEAREST);

glBegin(GL_QUADS);

// bottom face
glColor3f(lightBottom, lightBottom, lightBottom);
glTexCoord2d(0, 0);
glVertex3f(originX + BLOCKSIZE, originY, originZ);
glTexCoord2d(1, 0);
glVertex3f(originX + BLOCKSIZE, originY, originZ + BLOCKSIZE);
glTexCoord2d(1, 1);
glVertex3f(originX, originY, originZ + BLOCKSIZE);
glTexCoord2d(0, 1);
glVertex3f(originX, originY, originZ);

glEnd();
// bind the bottom texture
texForTop.bind();
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_NEAREST);
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_NEAREST);

glBegin(GL_QUADS);

// top face
glColor3f(lightTop, lightTop, lightTop);
glTexCoord2d(0, 0);
glVertex3f(originX, originY + BLOCKSIZE, originZ);
glTexCoord2d(1, 0);
glVertex3f(originX, originY + BLOCKSIZE, originZ + BLOCKSIZE);
glTexCoord2d(1, 1);
glVertex3f(originX + BLOCKSIZE, originY + BLOCKSIZE, originZ + BLOCKSIZE);
glTexCoord2d(0, 1);
glVertex3f(originX + BLOCKSIZE, originY + BLOCKSIZE, originZ);

glEnd();

glPopMatrix();
}
[/source]

Everything seems to render fine, and I'm able to navigate around the world by manipulating the camera position.

I have a method inside of my Block class (shown below) that checks to see whether a given Vector3f point in space is within the block's volume. The block is drawn from the middle, so 0,0,0 would be at the center of the cube.

For example, a block created at grid location (0, 0, -8) reports the following data when the player is 'inside' the cube:

Camera position: [-0.03],[-0.14],[-0.03]
Block: [-0.5 > 0.5],[-0.5 > 0.5],[-8.5 > -7.5]

N.B. The 'Block' line above shows the bounds for each axis (X min = -0.5, X max = 0.5, etc.).

I can't figure out why the camera isn't showing similar coords to the block [img]http://public.gamedev.net//public/style_emoticons/default/sad.png[/img]

Here's the Block class method for determining if a point in space is within its own volume:

[source lang="java"]

public boolean isPointInside(Vector3f point)
{
float minX = position.x - (BLOCKSIZE / 2);
float maxX = position.x + (BLOCKSIZE / 2);

float minY = position.y - (BLOCKSIZE / 2);
float maxY = position.y + (BLOCKSIZE / 2);

float minZ = position.z - (BLOCKSIZE / 2);
float maxZ = position.z + (BLOCKSIZE / 2);

System.out.println("Block: [" + minX + " > " + maxX + "],[" + minY + " > " + maxY + "],[" + minZ + " > " + maxZ + "]");

if (point.x > minX && point.y > minY && point.z > minZ)
{
if (point.x < maxX && point.y < maxY && point.z < maxZ)
{
return true;
}
}

return false;
}

[/source]

Any assistance with this would be greatly appreciated.

P.S. I know there are likely to be some heinous mistakes or irregularities with my code. I'm new to 3D Java programming (and LWJGL), so I'm likely to be making mistakes at the moment!

Share this post


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

  • Advertisement