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.
  • 相关阅读:
    Java基础--阻塞队列ArrayBlockingQueue
    Java基础--反射Reflection
    Java基础--对象克隆
    Java基础--HashCode
    Java基础--序列化Serializable
    OpenCV 绘制图像直方图
    PHP isset, array_key_exists配合使用, 并解决效率问题
    安装XDEBUG步骤及问题
    设计模式例子
    适配器模式例子
  • 原文地址:https://www.cnblogs.com/cnsoft/p/1289715.html
Copyright © 2011-2022 走看看