# www.jpct.net

## jPCT - a 3d engine for Java => Support => Topic started by: AGP on October 06, 2011, 09:08:16 pm

Title: World Space Bounds
Post by: AGP on October 06, 2011, 09:08:16 pm
Egon, do you agree with this code? Because if this is right, I have to find something to find wrong with my program. :- )

Code: [Select]
`     public float[] getWorldSpaceBounds() { float[] objectSpaceBounds = terrain.getMesh().getBoundingBox(); SimpleVector minimums = new SimpleVector(objectSpaceBounds[0], objectSpaceBounds[2], objectSpaceBounds[4]); SimpleVector maximums = new SimpleVector(objectSpaceBounds[1], objectSpaceBounds[3], objectSpaceBounds[5]); minimums.matMul(terrain.getWorldTransformation()); maximums.matMul(terrain.getWorldTransformation()); float[] worldSpaceBounds = new float[6]; worldSpaceBounds[0] = minimums.x; worldSpaceBounds[2] = minimums.y; worldSpaceBounds[4] = minimums.z; worldSpaceBounds[1] = maximums.x; worldSpaceBounds[3] = maximums.y; worldSpaceBounds[5] = maximums.z; return worldSpaceBounds;     }`
Title: Re: World Space Bounds
Post by: EgonOlsen on October 06, 2011, 09:16:53 pm
The logic seems to be flawed. As long as there's no rotation involved, it will work. But if, for example, the terrain rotates 45° around Y, your actual box will collapse to a plane with no depth on the x-axis. You have to create the bounding boxes vertices instead from the min/max values, rotate them and calculate a new bounding box from that that will represent your world space bounds.
Title: Re: World Space Bounds
Post by: AGP on October 06, 2011, 09:20:08 pm
Does that just mean apply the rotation just before calling matMul(getWorldTransformation())? Or is there something I'm missing?
Title: Re: World Space Bounds
Post by: EgonOlsen on October 06, 2011, 09:30:56 pm
No, matMul is the rotation. You just have to do that with all eight corners of the box and calculate the new min/max-values afterwards.
Title: Re: World Space Bounds
Post by: AGP on October 06, 2011, 11:38:18 pm
So it comes down to an iVertexController with which to get all the vertices, transform them with matMul, then test for the minimums and maximums?
Title: Re: World Space Bounds
Post by: EgonOlsen on October 06, 2011, 11:40:19 pm
No. You can simply create the needed vertices from the min/max-values that the getBoundingBox()-method returns. Just draw a quick sketch on paper and you'll see.
Title: Re: World Space Bounds
Post by: AGP on October 06, 2011, 11:44:09 pm
Now that you mention it I get it. Thanks a lot.
Title: Re: World Space Bounds
Post by: AGP on October 07, 2011, 02:11:09 am
I assume this one's right. If you say so, I will add it to the wiki's "code snippets" section, for future reference.
Code: [Select]
`     public float[] getWorldSpaceBounds() { float[] objectSpaceBounds = terrain.getMesh().getBoundingBox(); SimpleVector mins = new SimpleVector(objectSpaceBounds[0], objectSpaceBounds[2], objectSpaceBounds[4]); SimpleVector maxs = new SimpleVector(objectSpaceBounds[1], objectSpaceBounds[3], objectSpaceBounds[5]); SimpleVector[] p = new SimpleVector[8]; p[0] = new SimpleVector(mins.x, mins.y, maxs.z); p[1] = new SimpleVector(mins.x, mins.y, mins.z); p[2] = new SimpleVector(maxs.x, mins.y, mins.z); p[3] = new SimpleVector(maxs.x, mins.y, maxs.z); p[4] = new SimpleVector(maxs.x, maxs.y, mins.z); p[5] = new SimpleVector(maxs.x, maxs.y, maxs.z); p[6] = new SimpleVector(mins.x, maxs.y, mins.z); p[7] = new SimpleVector(mins.x, maxs.x, maxs.z); float minX = Float.MAX_VALUE, minY = Float.MAX_VALUE, minZ = Float.MAX_VALUE, maxX = Float.MIN_VALUE, maxY = Float.MIN_VALUE, maxZ = Float.MIN_VALUE; for (int i = 0; i < 8; i++) {      p[i].matMul(terrain.getWorldTransformation());      if (p[i].x < minX) minX = p[i].x;      if (p[i].y < minY) minY = p[i].y;      if (p[i].z < minZ) minZ = p[i].z;      if (p[i].x > maxX) maxX = p[i].x;      if (p[i].y > maxY) maxY = p[i].y;      if (p[i].z > maxZ) maxZ = p[i].z; } float[] worldSpaceBounds = new float[6]; worldSpaceBounds[0] = minX; worldSpaceBounds[2] = minY; worldSpaceBounds[4] = minZ; worldSpaceBounds[1] = maxX; worldSpaceBounds[3] = maxY; worldSpaceBounds[5] = maxZ; return worldSpaceBounds;     }`
Title: Re: World Space Bounds
Post by: EgonOlsen on October 07, 2011, 09:14:07 pm
Looks fine to me at first glance.
Title: Re: World Space Bounds
Post by: AGP on October 08, 2011, 01:08:47 am
Looks horrendous (maybe you could format it later), but it's on the wiki.