0

让我们假设我有一艘星际飞船,代码中的坐标如下

public float coords[] = {
        -0.025f,   -0.04f, -0.1f,   
        0.025f,   -0.04f, -0.1f,  
        -0.025f,   0.04f, -0.1f, 
    };

我需要检查与流星的碰撞。
所以星舰有三角形边界框,流星有方形边界框
因此,每当我平移或旋转我的星舰时,我都会使用 MVP 矩阵并将其与垂直着色器中的每个垂直相乘。但我的边界框也应该移动和旋转
我该怎么做?我是否应该在顶点着色器之外将 MVP 矩阵乘以星舰坐标和边界框坐标,并从顶点着色器中删除 MVP 矩阵?或者还有另一种方法可以在平移和移动我的真实对象的同时移动和平移边界框?

4

1 回答 1

1

我们需要分离两件事:碰撞检测和渲染。

当您渲染模型时,您通常有一些 VertexBuffer(存储在对象空间中的数据)并在着色器中通过 ModelViewMatrix 对其进行转换。仅仅为了改变模型的位置而修改 VertexBuffer 中的数据是相当昂贵的。

另一方面,当您检查碰撞时,您不是在着色器中而是在某些物理引擎中进行。例如,您可以在 CPU 端执行此操作。通常,您通过 MVP 转换边界框,然后执行碰撞测试。请注意,MVP 转换边界框应该非常快(立方体的几个顶点,或四边形与对象本身的数百个顶点)。

同步这些数据很重要(正如您所注意到的)。

一些代码:

update() {
    foreach o in objects
        o.calculateModelViewBoundingBox()

    testCollisionBetweenObjects()
}

render() { 
    foreach o in objects
        o.render()
}
于 2013-09-12T16:27:16.177 回答