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.