//Creamos la fuente
fuenteActual = new FTFont(fuentes.FontMap[fuente], out ultimoError);
//Convierte la fuente a textura. Estos valores se usan en el ejemplo, creo que tiene que ver con la calidad/eficiencia.
fuenteActual.ftRenderToTexture(64, 96);
//Ponemos la alineacion por defecto como centrada.
fuenteActual.FT_ALIGN = FTFontAlign.FT_ALIGN_CENTERED;
为了直截了当,这是我的代码,用于呈现一些文本。
Gl.glLoadIdentity();
float tamaño = texto.Tamaño;
double tan = texto.Orientacion.Y / texto.Orientacion.X;
float angulo = (float)Math.Atan(tan);
Gl.glColor3f(texto.getRFloat(), texto.getGFloat(), texto.getBFloat());
Gl.glScalef(tamaño, tamaño, tamaño);
Gl.glTranslatef((float)texto.Posicion.X, (float)texto.Posicion.Y, (float)texto.Posicion.Z);
Gl.glRotatef(angulo,0,1,0);
if (texto.Alineacion == Align.left)
fuenteActual.FT_ALIGN = FTFontAlign.FT_ALIGN_LEFT;
if (texto.Alineacion == Align.center)
fuenteActual.FT_ALIGN = FTFontAlign.FT_ALIGN_CENTERED;
if (texto.Alineacion == Align.right)
fuenteActual.FT_ALIGN = FTFontAlign.FT_ALIGN_RIGHT;
fuenteActual.ftBeginFont();
fuenteActual.ftWrite(texto.Text);
fuenteActual.ftEndFont();
1) 控件第一次绘制文本时,会正确检测位置 第二次控件重绘时,X位置被插入并且文本水平居中。只有高度(Y位置)正常工作。
2) 旋转不起作用。尽管模型视图矩阵已旋转,但文本始终水平显示。为什么是这样?我认为纹理字体被视为与任何其他OpenGL原语一样。
答案 0 :(得分:1)
你是围绕Y轴而不是绕Z轴旋转吗?
Gl.glRotatef(angulo,0,1,0);
我也不熟悉C#界面,但OpenGL中的角度通常以度数指定,但是您传递的值为Math.Atan2
,以弧度为单位。
这看起来也错了:
Gl.glScalef(tamaño, tamaño, tamaño);
Gl.glTranslatef((float)texto.Posicion.X, (float)texto.Posicion.Y, (float)texto.Posicion.Z);
通常首先进行翻译,然后进行比例。如果先缩放,则缩放将应用于X和Y偏移以及纹理。尝试交换这些。
答案 1 :(得分:0)
尝试使用“3f”功能版本,例如: glTranslate3f glScale3f
请小心订单,正如Finw所说。
此致