怎么旋转一张2d的图片呢?痛苦中,在线等...

时间:2021-09-30 23:37:22
初学dx,痛苦中。昨天使用
CreateOffscreenPlainSurface
D3DXLoadSurfaceFromFile
StretchRect
Present
等一些函数,
终于能把位图显示在屏幕上了,
今天想把它旋转一下,不知道该怎么办

12 个解决方案

#1


如果喜欢使用现成函数的话,尝试下面的一些对象、函数、方法:

IDirect3DTexture9
ID3DXSprite
D3DXMATRIX

D3DXCreateTextureFromFile
D3DXCreateSprite
D3DXMatrixRotationZ

ID3DXSprite::SetTransform
ID3DXSprite::Begin
ID3DXSprite::Draw
ID3DXSprite::End

#2


不转图片,转几何体或者视点就可以了

#3


嗯是的,事实上还是SetTransform

#4


单纯的想旋转位图可以看图像处理方面的书,我自己曾经就实现过,可惜效果没有GDI+和D3D的好,后来自己也懒得改进了。呵呵。

#5


学习,帮顶

#6


其实用纹理变换也许更好。
所谓纹理变换,与world, view, proj类似,不过:

A. 是在纹理坐标系下变换(原点在左上角,X右向,Y下向)。
B. 对于X/Y轴只能平移变换
C.       对于Z轴只能旋转(效果同3D变换)
D.       最后要转换成3*3矩阵

Matrix4x4To3x3(&matTexture, &matTexture);//必须将4*4=>3*3
g_pD3DDevice->SetTransform(D3DTS_TEXTURE0, &matTexture);
g_pD3DDevice->SetTextureStageState(0, D3DTSS_TEXTURETRANSFORMFLAGS, D3DTTFF_COUNT2);

#7


RE: cywater2000(如果) 

楼上所说的Matrix4x4To3x3是哪里的方法阿?MSDN怎么找不到呢?

#8


方法很多了,不过最好不要自已用sin,cos算法做,如果功底不强的话.效果不好.
//=============
用DX9里的纹理矩阵即可.
也可以让视角转动.

#9


使用纹理变换矩阵是一种选择,但是并不推荐,原因是最终得到的效果未必是楼主所需要的

纹理变换矩阵本质是改变了矩形顶点的纹理坐标,表面上看是可以达到旋转的效果
但是问题是:这种旋转不能保证旋转后出现的画面还是完整的整幅画面
            如果纹理的wrap模式打开的话,图片一些部分发生重复,一些部分消失不见

#10


"顾问团"说的对.呵呵,我忘了.哈哈.那就在渲染图片之前.
保存观察矩阵,然后更改视点.设置观察矩阵.然后渲图片,再恢复观察矩阵.
同样也适于世界矩阵操作.

#11


转几何体或者转纹理坐标

#12


直接用旋转坐标变换(theta 为角度)
xr = x*cos(theta) – y*sin(theta)
yr = x*sin(theta) + y*cos(theta)

#1


如果喜欢使用现成函数的话,尝试下面的一些对象、函数、方法:

IDirect3DTexture9
ID3DXSprite
D3DXMATRIX

D3DXCreateTextureFromFile
D3DXCreateSprite
D3DXMatrixRotationZ

ID3DXSprite::SetTransform
ID3DXSprite::Begin
ID3DXSprite::Draw
ID3DXSprite::End

#2


不转图片,转几何体或者视点就可以了

#3


嗯是的,事实上还是SetTransform

#4


单纯的想旋转位图可以看图像处理方面的书,我自己曾经就实现过,可惜效果没有GDI+和D3D的好,后来自己也懒得改进了。呵呵。

#5


学习,帮顶

#6


其实用纹理变换也许更好。
所谓纹理变换,与world, view, proj类似,不过:

A. 是在纹理坐标系下变换(原点在左上角,X右向,Y下向)。
B. 对于X/Y轴只能平移变换
C.       对于Z轴只能旋转(效果同3D变换)
D.       最后要转换成3*3矩阵

Matrix4x4To3x3(&matTexture, &matTexture);//必须将4*4=>3*3
g_pD3DDevice->SetTransform(D3DTS_TEXTURE0, &matTexture);
g_pD3DDevice->SetTextureStageState(0, D3DTSS_TEXTURETRANSFORMFLAGS, D3DTTFF_COUNT2);

#7


RE: cywater2000(如果) 

楼上所说的Matrix4x4To3x3是哪里的方法阿?MSDN怎么找不到呢?

#8


方法很多了,不过最好不要自已用sin,cos算法做,如果功底不强的话.效果不好.
//=============
用DX9里的纹理矩阵即可.
也可以让视角转动.

#9


使用纹理变换矩阵是一种选择,但是并不推荐,原因是最终得到的效果未必是楼主所需要的

纹理变换矩阵本质是改变了矩形顶点的纹理坐标,表面上看是可以达到旋转的效果
但是问题是:这种旋转不能保证旋转后出现的画面还是完整的整幅画面
            如果纹理的wrap模式打开的话,图片一些部分发生重复,一些部分消失不见

#10


"顾问团"说的对.呵呵,我忘了.哈哈.那就在渲染图片之前.
保存观察矩阵,然后更改视点.设置观察矩阵.然后渲图片,再恢复观察矩阵.
同样也适于世界矩阵操作.

#11


转几何体或者转纹理坐标

#12


直接用旋转坐标变换(theta 为角度)
xr = x*cos(theta) – y*sin(theta)
yr = x*sin(theta) + y*cos(theta)