Game Development Stack Exchange is a question and answer site for professional and independent game developers. It's 100% free, no registration required.

Sign up
Here's how it works:
  1. Anybody can ask a question
  2. Anybody can answer
  3. The best answers are voted up and rise to the top

I am writing a rather simple android game and I am implementing Open GL to draw a 3D cube that spins upon the X, Y and Z axis and I need to know where the user has clicked on the texture of the cube.

The texture is a simple square bitmap (100x100) that has a smaller square in the center. I need to know if the user touches the inner square. As well was tell which face of the cube the user touches. Does anyone know how this can be accomplished if not can anyone give some pseudo code on how to tell where the ray correlates to the texture? Or at least point me in the right direction.

The textures of each face are like this:

enter image description here

The whole cube looks like this:

The code I am using is from: It is a port to android from Lesson 6 NeHe. Example 6a: Photo-Cube

share|improve this question
Once you know which object was touched, you can iterate through its triangles doing a triangle/ray intersection test to see which face was touched. There's some code for that here. – Byte56 Jul 2 '13 at 18:20
It is only a rotating cube. But how could I tell if it hits the square in the center? – Clayton Jul 2 '13 at 18:31
To use @Byte56 example, subdivide the cube into smaller triangles. Then keep track of outside versus internal faces in a map to quickly determine from "which triangle face was touched" whether it was inside or outside the area you need. Alternately, add a smaller rectangle at each side of the cube where the red is; if it sticks out just a bit then it will get the intersection before the big cube behind, on each face. – Patrick Hughes Jul 2 '13 at 18:57

If your hit test is really that simple, then instead of doing more complicated triangle intersection as Byte56 suggests you could do simple AABB-ray intersection test. The intersection test will tell you the point that was hit. This point in model space will lie on one of the faces (so one of X, Y, or Z will be +/-h, where h is the half-width of your cube). Assuming that the red square is one third the size of the cube itself, that means that the other two coordinates must both fall within [-h/3,+h/3] in order for the hit to have been the red area.

The triangle approach is also sensible, especially if you want to support more complicated shapes (you could represent any shape on a cube's face with a 2D function, but say you want to support tetrahedrons or something beside just cubes). Tessellate your shape's faces so that (for the cube example) a face is made up of more than a single quad. With one third being the desired hit area width of your cube you'd need 9 quads or 18 triangles for your face. You can then do a triangle-ray collision test. Check if the collided triangles are the ones making up the central quad of any particular face to register hits to the red area.

share|improve this answer
Yes, the first suggestion is much more simple to do. Good answer Sean. – Byte56 Jul 2 '13 at 20:25
Can this work if the cube rotating along the x, y, and z axis simultaneously? – Clayton Jul 2 '13 at 21:21
To do the test against a rotated cube, you can simply rotate the ray by the inverse of the cubes rotation and test against the unrotated cube and you'll get the same answer as rotating the cube. – Adam Jul 2 '13 at 22:10
Indeed. Doing that means for specifically that you'd doing an AABB test instead of a general cube test which is way easier. Axis-aligned slab test in particular. See…. – Sean Middleditch Jul 2 '13 at 22:29
That means Byte56's solution will have to be used or a similar version of Ray Picking. With ray picking I know how to figure out which face of the cube was touched along with the triangle. But what about the inner square? As well as what if the user touches the border between the two triangles? – Clayton Jul 2 '13 at 22:29

Your Answer


By posting your answer, you agree to the privacy policy and terms of service.

Not the answer you're looking for? Browse other questions tagged or ask your own question.