游戏开发论坛

 找回密码
 立即注册
搜索
查看: 3214|回复: 5

高手进来看一下我的BillBoard算法哪里有错?

[复制链接]

45

主题

126

帖子

126

积分

注册会员

Rank: 2

积分
126
发表于 2009-6-8 15:06:00 | 显示全部楼层 |阅读模式
[code=C/C++]
//前面创建Sprite的缓冲区,将摄像机的位置vViewPos-自己的位置vPosition的单位向量作为发向量
RealmMatrix mTemp,mWorld;
RealmSprite *pSprite=&m_pSprites[nIndex];
if (pSprite->bBillboard)
{   
   //取得变换前后的法向量
   RealmVector vNormal0=RealmVector(pSprite->Vertices->vNor[0],0,pSprite->Vertices->vNor[2]);//法向量与XZ平行
   RealmVector vNormal1=m_pRender->GetViewPos()-pSprite->vPosition;vNormal1.y=0.0f;
   RealmVector vAxis;
   vAxis.Cross(vNormal0,vNormal1);                           //取得变换前后的法向量的叉积,即旋转轴
   mTemp.RotateArbi(vAxis,vNormal1.GetAngleWith(vNormal0));  //绕旋转轴旋转fAngle角度
  (*pSprite).Vertices[0].vNor[0]=vNormal1.x;                 //将Sprite的缓冲区顶点法线坐标更新
  (*pSprite).Vertices[0].vNor[2]=vNormal1.z;
  (*pSprite).Vertices[1].vNor[0]=vNormal1.x;
  (*pSprite).Vertices[1].vNor[2]=vNormal1.z;
  (*pSprite).Vertices[2].vNor[0]=vNormal1.x;
  (*pSprite).Vertices[2].vNor[2]=vNormal1.z;
  (*pSprite).Vertices[3].vNor[0]=vNormal1.x;
  (*pSprite).Vertices[3].vNor[2]=vNormal1.z;
}
else
{
  mTemp.Identity();
}
mWorld=mTemp;                           //获得了旋转矩阵
mWorld.Translate(pSprite->vPosition.x,pSprite->vPosition.y,pSprite->vPosition.z);//设置平移矩阵即Sprite的位置
m_pRender->SetWorldTransform(&mWorld);  //设置世界矩阵

//后面就是绘制Vertices的代码
[/code]



为什么绘制出来还是会随着相机的旋转而旋转,哪里有问题?

227

主题

1793

帖子

1866

积分

金牌会员

Rank: 6Rank: 6

积分
1866
发表于 2009-6-8 15:23:00 | 显示全部楼层

Re:高手进来看一下我的BillBoard算法哪里有错?

float mat[16];
glGetFloatv(GL_MODELVIEW_MATRIX, mat);
mat[1] = mat[2] = mat[6] = 0;
mat[4] = mat[8] = mat[9] = 0;
mat[0] = mat[5] = mat[10] = 1;
glLoadMatrixf(mat);
这是我看到的算法
有效
原理很简单
把矩阵里几项和旋转有关的值都手动修改即可
效率很高也很实用

34

主题

657

帖子

672

积分

高级会员

Rank: 4

积分
672
发表于 2009-6-8 15:54:00 | 显示全部楼层

Re:高手进来看一下我的BillBoard算法哪里有错?

楼主可以到这里学习一下。
http://www.lighthouse3d.com/opengl/billboarding/

45

主题

126

帖子

126

积分

注册会员

Rank: 2

积分
126
 楼主| 发表于 2009-6-9 11:33:00 | 显示全部楼层

Re:高手进来看一下我的BillBoard算法哪里有错?

lss,我试了一下,方法就是设置了一个单位化矩阵,然后设置偏移量,根本不能实现矩形贴图随着相机移动而动。倒觉得是圆柱体Billboard算法与我的算法很像,然后改成了那个想法。但设置后什么都看不到了,好奇怪。
RealmVector vNormal0=RealmVector(0.0f,0.0f,1.0f);
RealmVector vNormal1=m_pRender->GetViewPos()-pSprite->vPosition;
vNormal1.Normaliz();vNormal1.y=0.0f;
RealmVector vAxis;vAxis.Cross(vNormal0,vNormal1);
if (vNormal1.x<0)
{
        mWorld.RotateArbi(vAxis,vNormal0.GetAngleWith(vNormal1));
}
else
{
        mWorld.RotateArbi(vAxis,(-1)*vNormal0.GetAngleWith(vNormal1));
}
m_pRender->SetWorldTransform(&mWorld);

4

主题

46

帖子

46

积分

注册会员

Rank: 2

积分
46
发表于 2009-6-9 12:00:00 | 显示全部楼层

Re:高手进来看一下我的BillBoard算法哪里有错?

我2年前写了个东西,现在已经2年没做3D的东西了,看不懂什么意思了,你要是觉得还凑合就看看。当时是实现了角色上面的名字。

#pragma once
#include "d3d9.h"
#include "d3dx9.h"

#define          ReleaseInterface(object)  if(object!=NULL) {object->Release();object = NULL;}
#define INDEXCUBE_FVF (D3DFVF_XYZ|D3DFVF_DIFFUSE|D3DFVF_TEX1)

class yun
{
public:
        yun(LPDIRECT3DDEVICE9 pDevice,float width,float heigth);
        ~yun(void);
        void DrawIndexCube();                       //绘制立方体
        void SetMatrix(float Tx,float Ty,float Tz,float Rx,float Ry,float Rz,float Sl);//设置世界变化
private:

        //定义定点信息的结构体
        struct INDEXCUBEVERTEX
        {
                float x, y, z;                //顶点坐标       
                DWORD colour;                //顶点颜色
                float tu1, tv1;                //纹理1的uv值
        };

        LPDIRECT3DDEVICE9   m_pDevice;
        LPDIRECT3DTEXTURE9  m_pTexture;
        LPD3DXMESH          m_pMesh;

        float m_pWidth;
        float m_pHeigth;

        void  yunrun();
        void  initIndexCube();                   //初始化mesh的顶点缓冲,索引缓冲和属性缓冲
        void  initInterface();                   //初始化接口
};


#include ".\yun.h"

yun::yun(LPDIRECT3DDEVICE9 pDevice,float width,float heigth)
{
        m_pDevice = pDevice;
        m_pTexture=NULL;
        m_pMesh = NULL;
        m_pWidth = width;
        m_pHeigth = heigth;

        initInterface();
        initIndexCube();
}

yun::~yun(void)
{
        ReleaseInterface(m_pMesh);
        ReleaseInterface(m_pTexture);
}

void yun::initInterface()
{
        HRESULT  hr = 0;
        //创建一个空的MESH
        hr = D3DXCreateMeshFVF(12,24,D3DXMESH_MANAGED,INDEXCUBE_FVF,m_pDevice,&m_pMesh);

        for(int i = 0;i<3;i++)
                D3DXCreateTextureFromFile(m_pDevice,"我是车.png",&m_pTexture);
}

void yun::initIndexCube()
{
        INDEXCUBEVERTEX * vertexbuffer = 0;
        m_pMesh->LockVertexBuffer(0,(void**)&vertexbuffer);
        vertexbuffer[0].x = -m_pWidth/2; //0
        vertexbuffer[0].y = 0.0f;
        vertexbuffer[0].z = 0;
        vertexbuffer[0].tu1  = 0.0f;
        vertexbuffer[0].tv1  = 1.0f;
        vertexbuffer[0].colour = 0x00ffffff;

        vertexbuffer[1].x = -m_pWidth/2;  //1
        vertexbuffer[1].y = 0.0f;
        vertexbuffer[1].z = m_pHeigth;
        vertexbuffer[1].tu1  = 0.0f;
        vertexbuffer[1].tv1  = 0.0f;
        vertexbuffer[1].colour = 0x00ffffff;

        vertexbuffer[2].x = m_pWidth/2;  //2
        vertexbuffer[2].y = 0.0f;
        vertexbuffer[2].z = 0;
        vertexbuffer[2].tu1  = 1.0f;
        vertexbuffer[2].tv1  = 1.0f;
        vertexbuffer[2].colour = 0x00ffffff;

        vertexbuffer[3].x = m_pWidth/2;  //3
        vertexbuffer[3].y = 0.0f;
        vertexbuffer[3].z = m_pHeigth;
        vertexbuffer[3].tu1  = 1.0f;
        vertexbuffer[3].tv1  = 0.0f;
        vertexbuffer[3].colour = 0x00ffffff;

        m_pMesh->UnlockVertexBuffer();

        WORD * indexbuffer = 0;
        m_pMesh->LockIndexBuffer(0,(void**)&indexbuffer);
        indexbuffer[0] = 0;
        indexbuffer[1] = 2;
        indexbuffer[2] = 1;
        indexbuffer[3] = 2;
        indexbuffer[4] = 3;
        indexbuffer[5] = 1;       
        m_pMesh->UnlockIndexBuffer();

        DWORD *attributebuffer;
        m_pMesh->LockAttributeBuffer(0,&attributebuffer);
        attributebuffer[0] = 0;
        attributebuffer[1] = 0;
        m_pMesh->UnlockAttributeBuffer();
}

void yun:rawIndexCube()
{
        //yunrun();
        m_pDevice->SetRenderState(D3DRS_CULLMODE,D3DCULL_CW);
        m_pDevice->SetTexture(0,m_pTexture);
        m_pDevice->SetRenderState(D3DRS_ALPHABLENDENABLE,true);
        m_pDevice->SetRenderState(D3DRS_SRCBLEND,D3DBLEND_SRCALPHA);
        m_pDevice->SetRenderState(D3DRS_DESTBLEND,D3DBLEND_SRCCOLOR);
        m_pDevice->SetTextureStageState(0,D3DTSS_COLOROP,D3DTOP_SELECTARG1);
        m_pMesh->DrawSubset(0);
        D3DXMATRIX  world;
        D3DXMatrixIdentity(&world);
        m_pDevice->SetTransform(D3DTS_WORLD,&world);
        m_pDevice->SetRenderState(D3DRS_CULLMODE,D3DCULL_CCW);
        m_pDevice->SetRenderState(D3DRS_ALPHABLENDENABLE,false);
}

void yun::yunrun()
{
        INDEXCUBEVERTEX * vertexbuffer = 0;
        m_pMesh->LockVertexBuffer(0,(void**)&vertexbuffer);
        for (int i=0;i<4;++i)
        {
                vertexbuffer.tu1+=0.001f;
        }
        m_pMesh->UnlockVertexBuffer();
}

void yun::SetMatrix(float Tx,float Ty,float Tz,float Rx,float Ry,float Rz,float Sl)
{
        D3DXMATRIX mat,matRx,matRy,matRz,matT,matS;
        m_pDevice->SetTransform(D3DTS_WORLD,&mat);
        D3DXMatrixIdentity(&mat);
        D3DXMatrixRotationY(&matRy,Ry);
        D3DXMatrixRotationX(&matRx,Rx);
        D3DXMatrixMultiply(&matRy,&matRx,&matRy);
        D3DXMatrixRotationZ(&matRz,Rz);
        D3DXMatrixMultiply(&matRz,&matRz,&matRy);
        D3DXMatrixScaling(&matS,Sl,Sl,Sl);
        D3DXMatrixMultiply(&matRz,&matS,&matRz);
        D3DXMatrixTranslation(&matT,Tx,Ty,Tz);
        D3DXMatrixMultiply(&matRz,&matRz,&matT);
        m_pDevice->SetTransform(D3DTS_WORLD,&matRz);
}



//这个是调用的地方
yun *yun0=NULL;
        yun0=new yun(g_pD3DDevice,513,267);
        yun0->SetMatrix(che0->che_shuzu[0][72],che0->che_shuzu[0][73],che0->che_shuzu[0][74],che0->che_shuzu[0][37]-D3DX_PI/2,-che0->she_jiaodu_ping[0],che0->che_shuzu[0][39],0.02f);
        yun0->DrawIndexCube();

45

主题

126

帖子

126

积分

注册会员

Rank: 2

积分
126
 楼主| 发表于 2009-6-10 17:54:00 | 显示全部楼层

Re:高手进来看一下我的BillBoard算法哪里有错?

行了,是我的向量中的Cross()的汇编代码出错了。
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

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

GMT+8, 2025-12-20 01:08

Powered by Discuz! X3.4

Copyright © 2001-2021, Tencent Cloud.

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