当缩放遇到Texture2D drawAtPoint 函数的一个问题.
描述:两种结果
图片:
图片:
在此表示感谢.
事实上是我对opengl 不是很熟悉. 所以有一些困惑。 又不知道一些函数的用法和作用
我的想法是原地(保持中心点) 画个缩放的动画.
结果实现出来之后 确是中心点也跟着变大变小了。
glscalef 用来缩放。而这个函数的功能其实也是对当前的顶点矩阵 乘一个变化矩阵. 进而改变
(在已经变化的矩阵上进行 render 需要调整数据吗?)
用的是 texture2D.m (项目向导生成的) drawAtPoint(CGPointMake(x,y));
最后我用了一个蹩脚的办法 x/scale y/scale 。 scale 是变化的数值. 放大或缩小的比率 解决了这个问题。
晚上看到dr waston 这篇turorial ,再仔细比较一下差异。
如果我没理解错的话.dr的范例的缩放应该不是以一点为中心的。是以一点为辐射状的缩放, 明天去试验一下就知道了.
//再次比较一下 应该是这里的不同. texture2D的计算方法.
Sprite的计算方法
所以如果使用Textrure2D的 drawatpoint的函数时. 需要注意 缩放时要进行处理。
终版::
第一种方法: translatef 移动到目标点. 然后 调用 drawAtpoint( PointZero) 这就是和dr 上面用的方法类似。
而本人不熟悉这东西
第二种方法: 就是我后来蹩脚的方法. 前面不做translatef 后面调用 drawAtpoint( CGMakePoint(x/scale,y/scale)); 这可能只是适合这里. 如果x ,y ,z 三系都发生缩放。 单纯的/scale 估计就不可以了。但用Texture2D 也不可能了 因为是3D的咯。
总结起来: texture2D的 drawAtPoint 方法是要有使用条件的。
上图。
事实上是我对opengl 不是很熟悉. 所以有一些困惑。 又不知道一些函数的用法和作用
我的想法是原地(保持中心点) 画个缩放的动画.
结果实现出来之后 确是中心点也跟着变大变小了。
glscalef 用来缩放。而这个函数的功能其实也是对当前的顶点矩阵 乘一个变化矩阵. 进而改变
(在已经变化的矩阵上进行 render 需要调整数据吗?)
用的是 texture2D.m (项目向导生成的) drawAtPoint(CGPointMake(x,y));
最后我用了一个蹩脚的办法 x/scale y/scale 。 scale 是变化的数值. 放大或缩小的比率 解决了这个问题。
晚上看到dr waston 这篇turorial ,再仔细比较一下差异。
如果我没理解错的话.
//再次比较一下 应该是这里的不同. 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.