当缩放遇到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.
原文地址:https://www.cnblogs.com/cnsoft/p/1289715.html