【问题标题】:Text rendering with openGL: Can't rotate text, positioning not working properly使用openGL进行文本渲染:无法旋转文本,定位无法正常工作
【发布时间】:2010-11-08 07:42:31
【问题描述】:

嘿,这是我的场景: 使用视觉工作室 2008。 项目在c#中 使用 Tao 框架和 ISE.FreeType 来呈现文本。 字体已经加载并转换为纹理位图:

//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 位置是 ingored 并且文本是水平居中的。只有高度(Y 位置)有效。

2) 旋转不起作用。尽管旋转了模型视图矩阵,但文本始终水平显示。为什么是这样?我认为纹理字体被视为与任何其他 OpenGL 原语一样。

【问题讨论】:

    标签: c# opengl text fonts


    【解决方案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 偏移以及纹理。尝试交换这些。

    【讨论】:

    • 不幸的是那没有用...我尝试了每个轴大声笑...不知道出了什么问题! :(
    • 天啊,你是上帝……这是弧度的事情……我认为惯例是使用弧度而不是度数……谢谢你,你知道为什么 x 定位问题吗?跨度>
    【解决方案2】:

    尝试使用“3f”函数版本,例如: glTranslate3f glScale3f

    如 finw 所说,请注意订单。

    问候

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2020-04-05
      • 2015-08-26
      • 1970-01-01
      • 2015-12-13
      • 1970-01-01
      • 1970-01-01
      • 2012-09-13
      相关资源
      最近更新 更多