【问题标题】:Why my mesh vertices are moved by the same offset and not by offset calculated by bezier curve为什么我的网格顶点移动相同的偏移量而不是由贝塞尔曲线计算的偏移量
【发布时间】:2015-05-07 13:53:05
【问题描述】:

我有一个棘手的(我认为)问题。我正在准备一个有一部分的游戏,这是一场比赛。我想让它类似于老式的“莲花”游戏。玩家会从后面看到一辆汽车,一条道路应该不时转弯。所以我的想法是制作一个网格(道路),它将根据贝塞尔曲线更新顶点。游戏应该检查网格左边缘的每个顶点,并检查它应该向左或向右移动多少。右边缘也一样。以下是我的代码基于:

http://www.andengine.org/forums/post47301.html?hilit=%20mesh#p47301

贝塞尔曲线的计算取自andEngine中包含的QuadraticBezierCurveMoveModifier。

private Mesh createRoad(){

    //create triangles
    //
    //   E--F
    //   |\ |
    //   B--D
    //   |\ |
    //   A--C

    final int triangleCount = 10;
    int i = 0;
    final float pInitialX = 0;
    float pInintialY = 0;
    int vertexCount = Mesh.VERTEX_SIZE * triangleCount * 4;
    final float pColor = new Color(0f,0f,0f).getABGRPackedFloat();
    final float pBufferData[] = new float[vertexCount];

    for(int triangleIndex = 0; triangleIndex < triangleCount; triangleIndex++){

        pBufferData[(i * Mesh.VERTEX_SIZE) + Mesh.VERTEX_INDEX_X] = pInitialX;
        pBufferData[(i * Mesh.VERTEX_SIZE) + Mesh.VERTEX_INDEX_Y] = pInintialY;
        pBufferData[(i * Mesh.VERTEX_SIZE) + Mesh.COLOR_INDEX] = pColor;

        pBufferData[((i+1) * Mesh.VERTEX_SIZE) + Mesh.VERTEX_INDEX_X] = pInitialX;
        pBufferData[((i+1) * Mesh.VERTEX_SIZE) + Mesh.VERTEX_INDEX_Y] = pInintialY + 30;
        pBufferData[((i+1) * Mesh.VERTEX_SIZE) + Mesh.COLOR_INDEX] = pColor;

        pBufferData[((i+2) * Mesh.VERTEX_SIZE) + Mesh.VERTEX_INDEX_X] = pInitialX + 200;
        pBufferData[((i+2) * Mesh.VERTEX_SIZE) + Mesh.VERTEX_INDEX_Y] = pInintialY; 
        pBufferData[((i+2) * Mesh.VERTEX_SIZE) + Mesh.COLOR_INDEX] = pColor;

        pBufferData[((i+3) * Mesh.VERTEX_SIZE) + Mesh.VERTEX_INDEX_X] = pInitialX + 200;
        pBufferData[((i+3) * Mesh.VERTEX_SIZE) + Mesh.VERTEX_INDEX_Y] = pInintialY + 30;    
        pBufferData[((i+3) * Mesh.VERTEX_SIZE) + Mesh.COLOR_INDEX] = pColor;

        i = i + 4;
        pInintialY = pInintialY + 30;


    }

    final VertexBufferObjectManager vbom = engine.getVertexBufferObjectManager();
    final HighPerformanceMeshVertexBufferObject pMeshVBOM = new HighPerformanceMeshVertexBufferObject(vbom, pBufferData, pBufferData.length, DrawType.STREAM, true, Mesh.VERTEXBUFFEROBJECTATTRIBUTES_DEFAULT);

    road = new Mesh(300, 50, vertexCount, DrawMode.TRIANGLE_STRIP, pMeshVBOM){

        @Override
        protected void onManagedUpdate(final float pSecondsElapsed) {
            super.onManagedUpdate(pSecondsElapsed);
            drawByBezier();
            onUpdateVertices();
            this.mMeshVertexBufferObject.setDirtyOnHardware();

        };

        void drawByBezier(){
            float pBuff[] = pMeshVBOM.getBufferData();
            int i = 0;
            for (int triangleIndex = 0; triangleIndex < triangleCount; triangleIndex++) {

                pBuff[(i * Mesh.VERTEX_SIZE) + Mesh.VERTEX_INDEX_X] = getBezierX(i, 100, 0, 0);
                pBuff[((i+1) * Mesh.VERTEX_SIZE) + Mesh.VERTEX_INDEX_X] = getBezierX(i+1, 0, 0, 0);
                pBuff[((i+2) * Mesh.VERTEX_SIZE) + Mesh.VERTEX_INDEX_X] = getBezierX(i+2, 0, 0, 0) + 200;
                pBuff[((i+3) * Mesh.VERTEX_SIZE) + Mesh.VERTEX_INDEX_X] = getBezierX(i+3, 0, 0, 0) + 200;


                i = i + 4;



            }
        }
        float bezierX; 

        float getBezierX(int triangleIndex, float P1X, float PcX, float P2X){

            float t = triangleIndex / (triangleCount * 4);
            float u = 1 - t; 
            float tt = t * t; 
            float uu = u * u; 
            float ut2 = 2 * u * t; 


            return bezierX = (uu * P1X) + (ut2 * PcX) + (tt * P2X);
        }

    };


    return road;
}

结果是: 当我将 (i,0,0,0) 放入所有 getBezierX() 时(对于所有顶点:

https://www.dropbox.com/s/upuyjti66rtm44i/Screenshot_2015-05-07-15-02-17.png?dl=0

当我将 (i, 100, 0, 0) 放入第一个 getBezierX() 时,结果是:

https://www.dropbox.com/s/w3231zxrwytot71/Screenshot_2015-05-07-15-03-41.png?dl=0

如您所见,所有第一个顶点都向右移动相同的偏移量 (100)。其他参数是什么无关紧要,它总是按第一个参数的值移动。这是为什么?我在这里想念什么吗?

编辑

澄清一下。我想让这个黑色块像马路上的转弯一样弯曲。所以它的左右边缘应该是弯曲的。我想使用贝塞尔曲线来计算使用的网格的每个三角形的每个顶点的 x 位置。 y 位置应与它们相同。网格图在代码的开头注释。我想将点 A、B、E 沿一条曲线定位,并将 C、D、F 沿另一条曲线向右移动。

【问题讨论】:

  • 我认为这个问题应该完全改写(重新阅读 3 次,我一点也不知道问题是什么)并放置到不同的 SE 站点,但由于不具建设性的反对意见而对其进行了投票

标签: android opengl-es andengine mesh bezier


【解决方案1】:

好的,我发现了一个问题,但我真的不明白为什么会出现问题。所以在:

float getBezierX(int triangleIndex, float P1X, float PcX, float P2X){

        float t = triangleIndex / (triangleCount * 4);
        float u = 1 - t; 
        float tt = t * t; 
        float uu = u * u; 
        float ut2 = 2 * u * t; 


        return bezierX = (uu * P1X) + (ut2 * PcX) + (tt * P2X);
    }

我将float getBezierX(int triangleIndex, float P1X, float PcX, float P2X) 更改为float getBezierX(float triangleIndex, float P1X, float PcX, float P2X),现在可以使用了。但是为什么 int 是个问题呢?

【讨论】:

  • 因为如果 triangleIndex 是整数,则整数除以另一个整数的结果将始终是整数,然后将其分配给“t”。由于 triangleIndex 可能始终小于 (4*triangleCount),因此您将始终以 t=0.0 结束。
  • 那么 int / int 相除的结果总是四舍五入到 int 吗?即使我除以 1/300 也会让我浮起来?
  • 是的。所以 (1/300) 和 (299/300) 都会给你 0 和 1/300.0 或 1.0/300 会给你你真正想要的。
猜你喜欢
  • 1970-01-01
  • 2013-08-24
  • 1970-01-01
  • 1970-01-01
  • 2016-11-21
  • 1970-01-01
  • 2018-04-13
  • 2013-06-03
  • 1970-01-01
相关资源
最近更新 更多