我正在使用c ++和OpenGL在qt Creator中创建一个游戏,并试图在我的场景中添加边界框以实现碰撞检测。我在我的场景中使用从Maya导入的对象作为.obj,因此它们的尺寸没有在代码中设置,只有它们的位置,旋转和比例。我能够在每个对象周围创建一个与其位置匹配的边界框,但我很难找到一种方法来访问对象的min和max x,y和z值,以便将框与对象的大小相匹配。
有没有人对如何访问最小和最大坐标有任何想法?如果我可以访问这些值,我知道如何实现代码..
答案 0 :(得分:1)
您承担的问题是每个对象几何体都有不同的内部存储方式和边界框的确定。
让我们尝试一些例子来说明这一点:
假设我们有一个圆,其内部存储的绘图参数是中心坐标x_center
和y_center
以及半径radius
。如果您尝试确定此对象的边界框,则会看到它从(x_center - radius, y_center - radius)
延伸到(x_center + radius, y_center + radius)
。
如果你有一个未旋转的矩形,由它的主要对角线的两个点给出,边界框恰好与它的形状一致,所以你只需要给出坐标代表它的两个相同点。
另一方面,如果我们有一个多边形,则边界框将由所有多边形顶点的最小和最大坐标确定。如果允许旋转多边形,则需要在确定其最大值和最小值之前旋转所有顶点坐标,以获取边界框。
如果,另一个例子,我们有一个三次样条曲线,由它的四个控制点的坐标确定,你将确定两个三次多边形的最大值和最小值,这意味着求解两个二次方程(在推导之后),在一般情况下。
为了应对所有这些东西,几何形状通常包括一些多边形构造它的边界框的方法(它通常甚至被缓存,所以你不必计算它,只有在旋转之后或通过某种实例方法改变它的位置或比例。
当然,所有这些都取决于如何以及如何定义形状的实现方式。也许你的情况比我在这里暴露的情况简单,但你不能说。您也不会显示任何代码或输入/输出数据,如How to create a Minimal, Complete, and Verifiable example页中所述。因此,您最好编辑问题并添加示例代码,这将显示有关您确切问题的更多信息。
答案 1 :(得分:0)
如果您有obj加载器,那么您有一个数组。
float t[2100];
int x = 2100;
float xmax=-123243;
while(x>=0)
{
if(xmax<t[x]) xmax=t[x];
x-=3;
}
所以这是对象的最大x(?)。