Matrix operations in LWJGL, odd coordinate problems

Started by
-1 comments, last by PixelPrime11 11 years, 5 months ago
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 sad.png

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!

This topic is closed to new replies.

Advertisement