• FEATURED

View more

View more

View more

### Image of the Day Submit

IOTD | Top Screenshots

### The latest, straight to your Inbox.

Subscribe to GameDev.net Direct to receive the latest updates and exclusive content.

# Matrix operations in LWJGL, odd coordinate problems

Old topic!

Guest, the last post of this topic is over 60 days old and at this point you may not reply in this topic. If you wish to continue this conversation start a new topic.

No replies to this topic

### #1PixelPrime11  Members

Posted 09 November 2012 - 09:01 AM

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

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!

Old topic!

Guest, the last post of this topic is over 60 days old and at this point you may not reply in this topic. If you wish to continue this conversation start a new topic.