我正在尝试将纹理附加到我的游戏对象上,我发现,这个纹理总是被裁剪到我的对象的大小,所以如果我设置半径到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;
}发布于 2015-10-20 15:12:24
这可能是因为重新计算基于圆半径的纹理坐标。如果你想调整三角形扇形的大小,让纹理比例只是重新定位顶点(或者更好地用矩阵变换顶点位置)。
假设你和你的三角扇子组成的队伍应该显示整个纹理,坐标是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.顺便说一句,像上面这样增加偏移量可能会导致很难跟踪错误,如果您添加了更多的代码或移动行。最好在循环结束时单独增加。
至于旋转圆:通常你只需旋转顶点的位置,即重新计算那些。纹理坐标没有变化。或者,你保持顶点的位置和旋转纹理坐标,但这将使它更复杂,如果缩放,重新定位等也是如此。
https://stackoverflow.com/questions/33240268
复制相似问题