游戏开发论坛

 找回密码
 立即注册
搜索
查看: 2225|回复: 3

DX中2D图形旋转

[复制链接]

3

主题

11

帖子

15

积分

新手上路

Rank: 1

积分
15
发表于 2009-4-12 13:34:00 | 显示全部楼层 |阅读模式
求高手DX,2D部分的旋转方式算法.
在程序中,我建立4个顶点,放进一张图.怎么才能将图旋转.
谢谢..



[code=C/C++]

    LHxxSCREENVERTEX g_Vertices[] =
    {
    { 0.0f,   0.0f,   0.5f, 1.0f,    0.0f, 0.0f},  //红色
    { 200.0f,  0.0f,   0.5f, 1.0f,  1.0f, 0.0f},//蓝色   
    { 0.0f ,  200.0f,  0.5f, 1.0f,    0.0f, 1.0f},//绿色   
    { 200.0f,  200.0f,  0.5f, 1.0f,   1.0f, 1.0f }//白色
    };//0xffff0000//红色0xff00ff00//蓝色    0xff00ffff//绿色0xffffffff//白色
    // 4-------6 + 2
    //  |     / / |
    //  |     / /  |
    //  |    / /   |
    //  |  / /    |
    //  | / /     |
    // 5+ 3+------ 1

  
   
    //给存放矩阵点分配空间
    ob->LHxxScrVertex=(LHxxSCREENVERTEX*)malloc(4*sizeof(LHxxSCREENVERTEX ));
    memset(ob->LHxxScrVertex,0,4*sizeof(LHxxSCREENVERTEX ));

    // Create the vertex buffer.
    if( FAILED( m_pd3dDevice->CreateVertexBuffer( 4*sizeof(LHxxSCREENVERTEX),
                                         0, LHxxSCREENVERTEXFVF,
                                         D3DPOOL_DEFAULT, &ob->LHxx2DMVertexBuffer,NULL ) ) )
    { MessageBox(SAVE_HWND, "CREATE_2DIMAGE vbuf", "error tex", MB_OK);return;}
    // Now we fill the vertex buffer. To do this, we need to Lock() the VB to
    // gain access to the vertices. This mechanism is required becuase vertex
    // buffers may be in device memory.
    LHxxSCREENVERTEX* pVertices;
    if( FAILED( ob->LHxx2DMVertexBuffer->Lock( 0, sizeof(g_Vertices), (void**)&pVertices, 0 ) ) ) {return;}
    memcpy( pVertices, g_Vertices, sizeof(g_Vertices) );
    for( DWORD i=0; i<4; i++ )
    {ob->LHxxScrVertex=((LHxxSCREENVERTEX *)pVertices);}
    ob->LHxx2DMVertexBuffer->Unlock();





[/code]




不知怎么搞.还真转不了,移动放大都行.就是转不动..

如果有代码,可以发给我,就最好了.QQ:359397187

1367

主题

1993

帖子

2118

积分

金牌会员

Rank: 6Rank: 6

积分
2118
发表于 2009-4-12 14:31:00 | 显示全部楼层

Re:DX中2D图形旋转

强力沙发

3

主题

11

帖子

15

积分

新手上路

Rank: 1

积分
15
 楼主| 发表于 2009-4-13 11:10:00 | 显示全部楼层

Re:DX中2D图形旋转

经过2天的研究,终于搞出来了,问了好多人,都搞不出来,猜不到,平时和主管这么好,关于一点小小的技术,它竟然如此对我,不就是一个小小的公式吧.唉.代码如下.
好简单.
你就这样的素质,还是华农出来的,这么一点技术,有什么好secret.中国技术差,就是你这种人多呀.我是ROCK.谁要,我给谁.

void scr_rotate1(LHxx2DIMAGE *sc,float angle,float scale)
{
float dx,dy,dw,dh;//临时变量
float sw = sc->LHxxIw;//image width
float sh = sc->LHxxIh;//image height
float sclx,scly,sclw,sclh;//复位并放缩的坐标(局部坐标系--image的坐标系)

float hotx =sw/2;//旋转中心
float hoty =sh/2;
//复位  放缩 , 旋转  ,平移

    float xscale=scale;
float yscale=scale;



//复位并放缩后的区域
sclx = -hotx*scale;
scly = -hoty*scale;


sclw = (sw - hotx);
sclh = (sh - hoty);


float sint, cost;
sint = sinf(angle);
cost = cosf(angle);

LHxxSCREENVERTEX* ss;
    sc->LHxx2DMVertexBuffer->Lock( 0, 0, (void**)&ss, 0 );

((LHxxSCREENVERTEX *)ss)[0].LHxxSx = sclx*cost - scly*sint + sc->LHxxIx;
((LHxxSCREENVERTEX *)ss)[0].LHxxSy = sclx*sint + scly*cost + sc->LHxxIy;

((LHxxSCREENVERTEX *)ss)[1].LHxxSx = sclw*cost - scly*sint + sc->LHxxIx;
((LHxxSCREENVERTEX *)ss)[1].LHxxSy = sclw*sint + scly*cost + sc->LHxxIy;

((LHxxSCREENVERTEX *)ss)[2].LHxxSx = sclx*cost - sclh*sint + sc->LHxxIx;
((LHxxSCREENVERTEX *)ss)[2].LHxxSy = sclx*sint + sclh*cost + sc->LHxxIy;

((LHxxSCREENVERTEX *)ss)[3].LHxxSx = sclw*cost - sclh*sint + sc->LHxxIx;
((LHxxSCREENVERTEX *)ss)[3].LHxxSy = sclw*sint + sclh*cost + sc->LHxxIy;


    sc->LHxx2DMVertexBuffer->Unlock();

}

4

主题

36

帖子

42

积分

注册会员

Rank: 2

积分
42
发表于 2009-4-14 01:33:00 | 显示全部楼层

Re:DX中2D图形旋转

非常赞同这句话“这么一点技术,有什么好secret.中国技术差,就是你这种人多呀”
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

作品发布|文章投稿|广告合作|关于本站|游戏开发论坛 ( 闽ICP备17032699号-3 )

GMT+8, 2025-12-20 15:46

Powered by Discuz! X3.4

Copyright © 2001-2021, Tencent Cloud.

快速回复 返回顶部 返回列表