zoukankan      html  css  js  c++  java
  • 当缩放遇到Texture2D drawAtPoint 函数的一个问题.

     
    描述:两种结果
    图片:
      在此表示感谢.

    事实上是我对opengl 不是很熟悉. 所以有一些困惑。 又不知道一些函数的用法和作用

    我的想法是原地(保持中心点) 画个缩放的动画.  
    结果实现出来之后 确是中心点也跟着变大变小了。

    glscalef 用来缩放。而这个函数的功能其实也是对当前的顶点矩阵 乘一个变化矩阵. 进而改变

    (在已经变化的矩阵上进行 render 需要调整数据吗?) 
    用的是 texture2D.m (项目向导生成的) drawAtPoint(CGPointMake(x,y));  

    最后我用了一个蹩脚的办法  x/scale y/scale  。 scale 是变化的数值. 放大或缩小的比率  解决了这个问题。

    晚上看到dr waston 这篇turorial ,再仔细比较一下差异。

    如果我没理解错的话. dr的范例的缩放应该不是以一点为中心的。是以一点为辐射状的缩放, 明天去试验一下就知道了.

    //再次比较一下 应该是这里的不同. texture2D的计算方法.

    Copy code
        GLfloat        coordinates[] = { 0,    _maxT,
                                    _maxS,    _maxT,
                                    0,        0,
                                    _maxS,    0 };
        GLfloat        width = (GLfloat)_width * _maxS,
                    height = (GLfloat)_height * _maxT;
        GLfloat        vertices[] = {    -width / 2 + point.x,    -height / 2 + point.y,    0.0,
                                    width / 2 + point.x,    -height / 2 + point.y,    0.0,
                                    -width / 2 + point.x,    height / 2 + point.y,    0.0,
                                    width / 2 + point.x,    height / 2 + point.y,    0.0 };
        


    Sprite的计算方法
    Copy code
        y = SCREEN_HEIGHT-y;        // for OpenGL ES, (0,0) is at lower left corner!
        
        GLfloat _minU = mX/mTexture->getTextureWidth();
        GLfloat _maxU = (mX+mWidth)/mTexture->getTextureWidth();
        GLfloat _minV = mY/mTexture->getTextureHeight();
        GLfloat _maxV = (mY+mHeight)/mTexture->getTextureHeight();
        
        GLfloat    coordinates[] =
        {
            _minU,    _maxV,
            _maxU,    _maxV,
            _minU,    _minV,
            _maxU,    _minV
        };
        
        GLfloat    xx = - mWidth/2;
        GLfloat yy = - mHeight/2;
        
        GLfloat    vertices[] =
        {
            xx,            yy,                
            xx+mWidth,    yy,                
            xx,            yy+mHeight,
            xx+mWidth,    yy+mHeight    
        };


    所以如果使用Textrure2D的 drawatpoint的函数时. 需要注意 缩放时要进行处理。

    终版::
    第一种方法: translatef 移动到目标点. 然后 调用 drawAtpoint( PointZero)  这就是和dr 上面用的方法类似。
    而本人不熟悉这东西

    第二种方法: 就是我后来蹩脚的方法. 前面不做translatef  后面调用 drawAtpoint( CGMakePoint(x/scale,y/scale)); 这可能只是适合这里. 如果x ,y ,z 三系都发生缩放。 单纯的/scale 估计就不可以了。但用Texture2D 也不可能了 因为是3D的咯。


    总结起来: texture2D的 drawAtPoint 方法是要有使用条件的。

    上图。

    转:[dr waston]

    對的,我是以圖像的中心作為所有操作的中心點,在定義那個矩形時,做了下面這個手腳:

    GLfloat xx = - mWidth/2;
    GLfloat yy = - mHeight/2;



    (xx, yy)
    _______________
    !             !
    !             !
    !    (x,y)    !
    !             !
    !_____________!



    這樣不論你是縮放還是旋轉,都是基於這個中心點,不用再特別的調位置。

    Never giveup. Thanks the world.
  • 相关阅读:
    bzoj3505 数三角形 组合计数
    cogs2057 殉国 扩展欧几里得
    cogs333 荒岛野人 扩展欧几里得
    bzoj1123 BLO tarjan求点双连通分量
    poj3352 road construction tarjan求双连通分量
    cogs1804 联合权值 dp
    cogs2478 简单的最近公共祖先 树形dp
    cogs1493 递推关系 矩阵
    cogs2557 天天爱跑步 LCA
    hdu4738 Caocao's Bridge Tarjan求割边
  • 原文地址:https://www.cnblogs.com/cnsoft/p/1289715.html
Copyright © 2011-2022 走看看