我试图将纹理附加到我的游戏对象上,我发现,纹理总是被剪裁到我的对象的大小,所以如果我将半径设置为1f
,我可以看到完整的纹理,否则我可以看到中心裁剪。在这里你可以看到,我如何创建圆圈。我对OpenGL很陌生,所以我真的不知道还能告诉你什么。谢谢你的帮助。
private ViewObjectBuilder appendCircle(Geometry.Circle circle, int numPoints, float aspectRatio) {
final int startVertex = mOffset / FLOATS_PER_VERTEX;
final int numVertices = sizeOfCircleInVertices(numPoints);
mVertexData[mOffset] = circle.center.x / aspectRatio;
mTextureData[mOffset++] = (circle.center.x + 1f) * 0.5f;
mVertexData[mOffset] = circle.center.y;
mTextureData[mOffset++] = (circle.center.y + 1f) * 0.5f;
for (int i = 0; i <= numPoints; i++) {
float angleInRadians = ((float) i / (float) numPoints) * ((float) Math.PI * 2f);
final float c = (float) Math.cos(angleInRadians);
final float s = (float) Math.sin(angleInRadians);
mVertexData[mOffset] =
circle.center.x + circle.radius * c / aspectRatio;
mTextureData[mOffset++] =
(circle.center.x + circle.radius * c + 1f) * 0.5f;
mVertexData[mOffset] = circle.center.y + circle.radius * s;
mTextureData[mOffset++] =
(circle.center.y + circle.radius * s + 1f) * 0.5f;
}
mDrawList.add(() -> glDrawArrays(GL_TRIANGLE_FAN, startVertex, numVertices));
return this;
}
答案 0 :(得分:1)
这可能是由于根据圆半径重新计算纹理坐标。如果你想调整三角形扇形的大小,让纹理缩放只是重新定位顶点(或者用矩阵更好地变换顶点位置)。
假设您使用三角形扇形成的小队应显示整个纹理,坐标将为0.0 / 0.0,0.0 / 1.0,1.0 / 0.0和1.0 / 1.0。正如您所看到的,它们与顶点坐标无关,实际上根本没有变化(除非您想以某种方式为纹理设置动画)。
修改:
重新阅读您的代码,您的对象似乎包含更多三角形以形成实际的圆形形状。在这种情况下,你只需像你一样计算纹理坐标(没有完全检查正确性),但使用半径为1,因此你可以直接使用正弦和余弦和偏移:
mTextureData[mOffset++] = c * 0.5f + 0.5f;
//assume c = 1.0 then your coordinate becomes 1.0,
//if c = -1.0 then your coordinate becomes 0.0 etc.
顺便说一句,如果添加更多代码或移动线条,增加上述偏移量可能会导致很难跟踪错误。在循环结束时分别更好地增量。
至于旋转圆圈:通常你只是旋转顶点位置,即重新计算它们。纹理坐标不是变化。或者,您保留顶点位置并旋转纹理坐标,但如果使用缩放,重新定位等,这将使其更加复杂。