为什么我的网格顶点移动相同的偏移量而不是贝塞尔曲线计算的偏移量
Why my mesh vertices are moved by the same offset and not by offset calculated by bezier curve
我有一个棘手的(我认为)问题。我正在准备一场比赛,比赛的一部分。我想让它类似于 oldschool "Lotus" 游戏。玩家会从后面看到一辆车,一条路应该不时转弯。所以我的想法是制作一个网格(道路),它将根据贝塞尔曲线更新顶点。游戏应该检查网格左边缘的每个顶点,并检查它应该向左或向右移动多少。右边缘相同。以下是我的代码基于:
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
当我为第一个 getBezierX() 输入 (i, 100, 0, 0) 时,结果是:
https://www.dropbox.com/s/w3231zxrwytot71/Screenshot_2015-05-07-15-03-41.png?dl=0
如您所见,所有第一个顶点都向右移动了相同的偏移量 (100)。其他参数是什么并不重要,它总是根据第一个参数的值移动。这是为什么?我在这里想念什么吗?
编辑
澄清一下。我想让这个黑色块像路上的转弯一样弯曲。所以它的左右边缘应该是弯曲的。我想使用贝塞尔曲线来计算所用网格的每个三角形的每个顶点的 x 位置。 y 位置应该与它们相同。在代码的开头注释了网格图。 Co 我想沿着一条曲线定位点 A、B、E,并沿着另一条曲线向右移动 C、D、F。
好的,我发现了一个问题,但我真的不明白为什么会出现问题。所以在:
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 是个问题?
我有一个棘手的(我认为)问题。我正在准备一场比赛,比赛的一部分。我想让它类似于 oldschool "Lotus" 游戏。玩家会从后面看到一辆车,一条路应该不时转弯。所以我的想法是制作一个网格(道路),它将根据贝塞尔曲线更新顶点。游戏应该检查网格左边缘的每个顶点,并检查它应该向左或向右移动多少。右边缘相同。以下是我的代码基于:
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
当我为第一个 getBezierX() 输入 (i, 100, 0, 0) 时,结果是:
https://www.dropbox.com/s/w3231zxrwytot71/Screenshot_2015-05-07-15-03-41.png?dl=0
如您所见,所有第一个顶点都向右移动了相同的偏移量 (100)。其他参数是什么并不重要,它总是根据第一个参数的值移动。这是为什么?我在这里想念什么吗?
编辑
澄清一下。我想让这个黑色块像路上的转弯一样弯曲。所以它的左右边缘应该是弯曲的。我想使用贝塞尔曲线来计算所用网格的每个三角形的每个顶点的 x 位置。 y 位置应该与它们相同。在代码的开头注释了网格图。 Co 我想沿着一条曲线定位点 A、B、E,并沿着另一条曲线向右移动 C、D、F。
好的,我发现了一个问题,但我真的不明白为什么会出现问题。所以在:
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 是个问题?