游戏开发论坛

 找回密码
 立即注册
搜索
查看: 2661|回复: 12

牛刀小试,发个截图

[复制链接]

362

主题

3023

帖子

3553

积分

论坛元老

Rank: 8Rank: 8

积分
3553
发表于 2008-4-28 17:21:00 | 显示全部楼层 |阅读模式
地形生成过程:
1) 随机高度的 10*10 网格
2) 插值成 100*100 网格
3) smooth计算

实时光照:关闭
顶点颜色 == 顶点高度/高度范围 * 255 ,灰度
将顶点颜色作为光度图,与纹理调制

UI使用'ISurf ' 2D接口的3D实现来绘制

另外有一条纽带,扭转 -180-360*n 角度

法线和实时光照我还没弄。
sf_2008428172035.jpg

2

主题

61

帖子

61

积分

注册会员

Rank: 2

积分
61
发表于 2008-4-28 17:22:00 | 显示全部楼层

Re:牛刀小试,发个截图

看不清,啥东东啊

362

主题

3023

帖子

3553

积分

论坛元老

Rank: 8Rank: 8

积分
3553
 楼主| 发表于 2008-4-28 17:24:00 | 显示全部楼层

Re: Re:牛刀小试,发个截图

只为源码: Re:牛刀小试,发个截图

看不清,啥东东啊


MJ of small small C

50

主题

200

帖子

200

积分

中级会员

Rank: 3Rank: 3

积分
200
发表于 2008-4-29 14:00:00 | 显示全部楼层

Re:牛刀小试,发个截图

怎么做到smooth的?
这个偶不懂-_-b

362

主题

3023

帖子

3553

积分

论坛元老

Rank: 8Rank: 8

积分
3553
 楼主| 发表于 2008-4-29 14:36:00 | 显示全部楼层

Re: 牛刀小试,发个截图

需要先对顶点插值,然后再smooth,否则没什么意思。

单纯顶点插值本身几乎看不出来任何效果。但是与smooth结合,效果就出来了。

为什么需要插值?而不是直接创建100*100随机顶点?
----那样就变成了草丛了。

从下图可以明显对比出来:
sf_2008429143558.jpg

50

主题

200

帖子

200

积分

中级会员

Rank: 3Rank: 3

积分
200
发表于 2008-4-29 14:44:00 | 显示全部楼层

Re:牛刀小试,发个截图

我是说...
你这个smoooth 是根据什么公式来的.....

362

主题

3023

帖子

3553

积分

论坛元老

Rank: 8Rank: 8

积分
3553
 楼主| 发表于 2008-4-29 15:02:00 | 显示全部楼层

Re:牛刀小试,发个截图

void CModuleA::SetupVertices(PFUNC pf,PCOLORFUNC pcolorf,UInt32 smooth)
{
        MYVERTEX *vv=(MYVERTEX *)pvb->Lock();
        MYVERTEX *v;
        Float tx=0,tz=0;
        Float _tx=0,_tz=0;
        if(smooth>0)
        {
                Float **tt=new Float *[numZ+smooth];
                for(UInt32 _z=0; _z<numZ+smooth; _z++)
                {
                        tt[_z]=new Float[numX+smooth];
                        for(UInt32 _x=0; _x<numX+smooth; _x++)
                        {
                                _tx=(Float)_x/(numX+smooth-1);
                                _tz=(Float)_z/(numZ+smooth-1);
                                tt[_z][_x] = (*pf)(_tx,_tz) * HeightRange;
                        }
                }
                for(UInt32 z=0; z<numZ; z++)
                {
                        for(UInt32 x=0; x<numX; x++)
                        {
                                v = vv + z*numX + x;
                                tx=(Float)x/(numX-1);
                                tz=(Float)z/(numZ-1);
                                v->x = tx * Size;
                                v->z = tz * Size;
                                v->y = 0;
                                for(Int32 s=0; s<=smooth; s++)
                                        for(Int32 t=0; t<=smooth; t++)
                                                v->y += tt[z+s][x+t];
                                v->y /=( smooth+1)*(smooth+1);
                                v->u = tx;
                                v->v = tz;
                                v->color = (*pcolorf)(v->y/HeightRange);

362

主题

3023

帖子

3553

积分

论坛元老

Rank: 8Rank: 8

积分
3553
 楼主| 发表于 2008-4-29 15:18:00 | 显示全部楼层

Re:牛刀小试,发个截图

光线是通过UI控制的。

class CForm2:virtual public CForm
{
public:
    CBtn * btnOK;
    CBtn * btnOK2;
    CListBox * lstList;
    LIGHT l;
private:
    CTexture *m_pTex;
    CTextureSurf *m_pSurf;
    CForm1 *m_pTT;
    Bool m_TT_B;
public:
    DYNAMIC_FUNC7(::CForm2,inst::ui::CForm,inst::ui::IForm,inst::ui::IMasterContainer,inst::ui::IContainer,inst::ui::IElement,inst::IDynamic);
    CForm2():CForm(L"Form2")
    {
        InitComponent();
        m_pTT=new CForm1;
        m_pTT->SetAlpha(0);
        pUI->RemoveForm(m_pTT);
        m_pTT->Show();
        m_pTT->SetScreen(null);

        ZeroMemory(&l,sizeof(l));
        l.Type=LIGHT_DIRECTIONAL;
        l.Dir=VEC3(0,-1,0);
        l.Color=0xFFFFFF;
    }
    virtual ~CForm2()
    {
        delete m_pTT;
        DestroyComponent();
    }
private:
    void InitComponent();
    void DestroyComponent();
private:void btnOK_MouseDown(void *es,PARAM1 p1,PARAM2 p2,POS x,POS y)
        {
            if(p1 & 1) l.Dir.x-=0.5;
            if(p1 & 2) l.Dir.x+=0.5;
            if(l.Dir.x>10) l.Dir.x=10;
            if(l.Dir.x<-10) l.Dir.x=-10;
            g_pg->SetLight(0,l);
        }
private:void btnOK2_MouseDown(void *es,PARAM1 p1,PARAM2 p2,POS x,POS y)
        {
            if(p1 & 1) l.Dir.z-=0.5;
            if(p1 & 2) l.Dir.z+=0.5;
            if(l.Dir.z>10) l.Dir.z=10;
            if(l.Dir.z<-10) l.Dir.z=-10;
            g_pg->SetLight(0,l);
        }
private:void btnOK_MouseEnter(void *es)
        {
            m_TT_B=False;
        }
private:void btnOK_MouseMove(void *es,PARAM1 p1,PARAM2 p2,POS x,POS y)
        {
            if(m_TT_B)return;
            pUI->SetToolTip((IElement *)m_pTT);
            m_pTT->SetX(GetX()+btnOK->GetX()+x);
            m_pTT->SetY(GetY()+btnOK->GetY()+y);
            m_pTT->SetAlpha(0);
            m_TT_B=True;
        }
private:void btnOK_MouseLeave(void *es)
        {
            pUI->SetToolTip(null);
            m_TT_B=False;
        }
public: void Update(UInt32 dt)
        {
            if(m_TT_B)
            {
                if(m_pTT->GetAlpha()>196)return;
                m_pTT->SetAlpha(m_pTT->GetAlpha()+dt*0.7);
            }
        }
};

362

主题

3023

帖子

3553

积分

论坛元老

Rank: 8Rank: 8

积分
3553
 楼主| 发表于 2008-4-29 18:57:00 | 显示全部楼层

Re: 牛刀小试,发个截图

再来一张
sf_2008429185712.jpg

362

主题

3023

帖子

3553

积分

论坛元老

Rank: 8Rank: 8

积分
3553
 楼主| 发表于 2008-4-29 18:59:00 | 显示全部楼层

Re: 牛刀小试,发个截图

第3张
sf_2008429185834.jpg
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

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

GMT+8, 2026-1-22 16:18

Powered by Discuz! X3.4

Copyright © 2001-2021, Tencent Cloud.

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