随笔 - 22  文章 - 0 评论 - 35 trackbacks - 0
<2012年2月>
2930311234
567891011
12131415161718
19202122232425
26272829123
45678910

昵称:炮灰九段
园龄:3年7个月
粉丝:0
关注:0

搜索

 
 

常用链接

随笔分类

随笔档案

最新评论

阅读排行榜

评论排行榜

推荐排行榜

你是否能够告诉我
怎样才能忘掉你
说什么话做什么事
说多少话做多少事
怎样才能够不再爱你


每天每时
无论顺境或逆境
怎样才能不再想念你


节日里,不再为你祝福
灾难时,也不再祈求你的关怀
永远,不再与你并肩


走过街巷,走过小路,走过荒原
走过祖先的墓地
仰望日出之前的天空
也永不会感觉悲凉

夜晚,独自睡眠永远不感孤闷
白昼,一个人守着炉火永远甘于寂寞
永远像一只鸟
在成千上万只鸟当中
无奈地飞翔

你是否能够告诉我
fk! 网络真差

今晚的黑暗淹没鲜花  不淹没花的香气

今晚的落叶黑夜接不住  大地也接不住了

其实根本就没有林月珍对不对...

posted @ 2009-02-27 00:00 炮灰九段 阅读(267) 评论(1) 编辑

首先,渲染到纹理是D3D中的一项高级技术。一方面,它很简单,另一方面它很强大并能产生很多特殊效果。 比如说发光效果,环境映射,阴影映射,景深效果,都可以通过它来实现。渲染到纹理只是渲染到表面的一个延伸。我们只需对得到的纹理图像进行后处理即可。首先,我们要创造一个纹理,并且做好一些防范措施。第二步我们就可以把适当的场景渲染到我们创建的纹理上了。然后,我们把这个纹理用在最后的渲染上。

 

GeForce 6系列图形芯片支持的PixelShader 3.0中还支持一种较新的技术,我们要额外放在这一页来简要介绍。这就是多渲染目标(MRT)技术。

  这种技术的作用就是将每像素的数据保存到不同的缓冲区当中。这样的好处就是这些缓冲区数据由此可以成为照片级光照效果着色器的参数。

  在这种方法的帮助下,光照可以在所有几何图形被渲染以后最后进行应用,不再需要进行多步的渲染。因而这种技术也可以被称为延期着色(Deferred Shading)。存储在这种类型的表面中的数据可以包括位置、法线、颜色以及材质的信息。

  我们来看一个MRT技术用于产生一个高动态范围的场景的实例。


第一个渲染步骤

  在第一个渲染步骤,开发者创造出3个输出缓冲区,这包括:1个颜色的贴图、1个法线的贴图和1个深度的贴图。


第二个渲染步骤

  在第二个步骤,使用法线和深度贴图结合光照条件计算出光照。然后,场景在带有颜色贴图的情况下被精确地照明。


第三个渲染步骤

  最后在第三个步骤中,超过0~1范围的超高亮度的光线值被带入场景中,计算包含高亮度像素附近的像素的发光。这个步骤产生出难以置信的发光效果。

posted @ 2008-12-01 23:41 炮灰九段 阅读(1159) 评论(0) 编辑

前段时间接触过havok,做过几个引擎使用的物理测试。其中一个是单纯创建一个简单的havok物理世界,然后放入特定的刚体,设置好世界的重力刚体自动开始运动,不渲染出物体,仅在console下打印出每秒物理计算的次数。这一个还算是简单。类似的一个测试是创建了一个封闭的物理空间,放入n个动态的刚体每隔一段时间给他们随机的力,让他们在空间中做物理运动,同样打印每秒物理计算的次数。havok还算不错,计算的次数应该基本都不会低于其他的物理引擎。

还有一个比较复杂的物理测试。也测出了很多的问题。

还有,我上次的日志真的只是想抛砖引玉,所以发到了首页原创版块,不过国内研究havok的果然很少,所以我看havok的途径基本就是研究havok的demo逻辑和看havok的api文档。当然发现了一些问题,至今还没有得到很好的解决:

比如,两个物体可以设置碰撞过滤(两物体之间不做任何碰撞检测),但是如果初始位置重合在一起,初始的时候会有一定的作用力,例如两正方体会相互挤开。

有一些代码发在havok的论坛上了,还有一些差不多的代码,整理了再说吧。

posted @ 2008-11-09 23:31 炮灰九段 阅读(491) 评论(4) 编辑
    只有注册用户登录后才能阅读该文。阅读全文
posted @ 2008-10-15 07:56 炮灰九段 阅读(24) 评论(0) 编辑
    

这几天在看Intel公司刚刚收购开放下载的havok物理引擎,有几点感受。为了研究havok,多么猥琐阴险狡诈的招都被我使了出来,在google上搜过n个正则关键字,去过专业的物理研究论坛,去了havok的官方网站,去了Interhavok论坛。最后没找到多少资料,没找到一个小例子。所以只得再havok SDKsDocDemo下面逛,看英文,猜代码意图。浑浑噩噩的过了两天。

Havokdemo看过的肯定知道,框架做得相当复杂和诡异,其实并不适合去学习。The framework of the demos is very complex and esoteric. I do not want to understand these complex framework, Because I have a practical application in my framework, companies have the framework of the company, no one will want to make their own framework replaced for a physical engine.这是我发在havok论坛上的帖子。

这也难怪,havok引擎刚刚开放下载,国内应用的都少,教程更是别提。我这几天算是过得比较痛苦,写个简单的入门文档,希望抛砖引玉,帮大家简单入入门,完全没有误人子弟的意思,大家别拍我~ ~我做的主要是havok的刚体碰撞。简单的20 * 20 的正方体自由下落在一平面上。

首先,关于Havok的几个简单的物理概念:

hkpWorld havok的物理世界场景 场景有其自己的属性,如万有引力等,每个havok的仿真场景可以有一个或者多个hkpWorld的实例。

hkpRigidBody havok的刚体,刚体可以有自己的运动属性,并能通过setMotionType来设置修改。

hkVisualDebugger 关于havok的一个很好的调试工具

 

下面是整个程序的简单代码,没有用图形库输出图形,可以通过havok自带的工具VisualDebugger工具来查看刚体。省略了部分内存方面的代码,我也不是很明白。

int main(int argc, const char** argv)
{
       {
              // 创建physics world 通过填充hkpWorldCinfo
              hkpWorld* physicsWorld;
              {
                     // 创建物理世界:
                     hkpWorldCinfo worldInfo;
                     worldInfo.m_simulationType = hkpWorldCinfo::SIMULATION_TYPE_MULTITHREADED;
                     worldInfo.m_gravity.set(0.0f, -9.8f, 0.0f);
                     physicsWorld = new hkpWorld(worldInfo);
              }
              physicsWorld->markForWrite();
              {
                     hkpAgentRegisterUtil::registerAllAgents( physicsWorld->getCollisionDispatcher() );
              }
              // 在这里创建我们的刚体模拟
              setupPhysics( physicsWorld );
              // 初始化VisualDebugger工具
              hkVisualDebugger* vdb = setupVisualDebugger(context);

         hkReal timestep = 1.f / 60.f;
        int numSteps = int(60.f / timestep);
        for ( int i = 0; i < numSteps; ++i )
        {
            // 可以得到刚体的一些实时信息,借助图形库进行渲染
            hkVector4 pos = g_ball->getPosition();
             printf("[%f,%f,%f]"n", pos(0), pos(1), pos(2));
        }  
       hkBaseSystem::quit();
       return 0;
}

void setupPhysics(hkpWorld* physicsWorld)
{
       // 创建地面的 静态刚体
       {
              hkpRigidBodyCinfo boxInfo;
              hkVector4 boxSize(5.0f, 0.5f , 5.0f);
              hkpBoxShape* boxShape = new hkpBoxShape(boxSize);
              boxInfo.m_shape = boxShape;
              boxInfo.m_motionType = hkpMotion::MOTION_FIXED;
              boxInfo.m_position.set(0.0f, 0.0f, 0.0f);
              boxInfo.m_restitution = 0.9f;

              hkpRigidBody* floor = new hkpRigidBody(boxInfo);
              boxShape->removeReference();
              g_ball = floor;
              physicsWorld->addEntity(floor);
              floor->removeReference();
       }
// 创建 20 * 20 的盒子
       const hkReal boxDim    = 0.2f;        // This is the size of the cube side of the box
       const hkReal boxRadius = boxDim * 0.01f; // 盒子的角度 这个有问题 原来这个是大小
       const hkReal gapx    = boxDim * 0.05f;           // This is the gap betwen boxes 间距是盒子大小的多少比率
       const hkReal gapy    = boxRadius;
       const hkReal heightOffGround = 10.0f;       // This is the height of the pyramid off the gound
       int    pyramidSize = 20;     // This is the number of boxes along the base (also vertically)
       // 长方体的长宽
       hkReal extendedBoxDimX = boxDim + gapx;
       //hkReal extendedBoxDimY = boxDim + gapy;
       hkReal extendedBoxDimZ = boxDim + gapx;
       hkVector4 startPos( 0.0f , heightOffGround + gapy + boxDim * 0.5f, 0.0f);
       // Build pyramid 构建
       {
              hkVector4 boxRadii(boxDim *.5f, boxDim *.5f, boxDim *.5f);
              hkpShape* boxShape = new hkpBoxShape( boxRadii , boxRadius );
              // 变成横向的一块下来 20 * 20的盒子
              for(int i=0; i<pyramidSize; i++)
              {
                     // This constructs a row, from left to right 从左到右
                     hkVector4 start(0, 0, extendedBoxDimZ * i);
                     for(int j=0; j< pyramidSize; j++)
                     {
                            hkVector4 boxPos(start);
                            hkVector4 shift(j * extendedBoxDimX, 0.0f, 0.0f);
                            boxPos.setAdd4(boxPos, shift);
                            boxPos.setAdd4(boxPos, startPos);

                            hkpRigidBodyCinfo boxInfo;
                            //盒子的质量
                            boxInfo.m_mass = 100.0f;
                            // calculate the correct inertia 惯性与质量有关
                            hkReal d = boxInfo.m_mass * boxDim * boxDim / 6.0f;

                            // for small boxes increase inertia slightly
                            if ( boxRadius < 0.1f )
                            {
                                   d *= 2.0f;
                                   if ( boxRadius < 0.03f )
                                   {
                                          d *= 2.0f;
                                   }
                            }
                            boxInfo.m_inertiaTensor.setDiagonal(d,d,d);
                            boxInfo.m_shape = boxShape;
                            boxInfo.m_motionType = hkpMotion::MOTION_DYNAMIC;
                            boxInfo.m_position = boxPos;
                            boxInfo.m_restitution = 0.5f;                                   // 表面的弹力
                            boxInfo.m_friction = 0.6f;                                       // 表面的摩擦      
                            boxInfo.m_solverDeactivation = hkpRigidBodyCinfo::SOLVER_DEACTIVATION_MAX;
                            hkpRigidBody* boxRigidBody = new hkpRigidBody(boxInfo);
                            //将所有的刚体添加到世界中
                            physicsWorld->addEntity( boxRigidBody );
                            boxRigidBody->removeReference();                        
}
              }
              boxShape->removeReference();
       }
}

我们只要在自己的代码中调用Havok API构建抽象的物理世界,抽象的物体,即给出物理世界的数据,就能直接通过hkVisualDebugger接口的socket连接发送世界数据到HavokVisualDebugger宿主程序,并在其可视化物理场景视图中显示出来。以下是在工具下的两张截图:

 

 

 

 

demo框架中:

程序的可运行代码:

http://files.cnblogs.com/hellohuan/ConsoleMain.rar

posted @ 2008-09-03 22:19 炮灰九段 阅读(3646) 评论(21) 编辑
摘要: 如果你有一定的英语基础,并希望突破计算机英语的障碍并成为高手,从现在起就养成一个学用计算机英语的良好习惯吧。比如,选一本适合自己的计算机英语教材;保证一年至少读1-2本原版影印的计算机书,并坚持读完;在程序中使用英文注释;不看中英文对照读物   干程序员是一项很辛苦的工作,要成为一个高水平的程序员尤为艰难。这是因为计算机软件技术更新的速度越来越快,而这些技术大多来源于英语国家,我们在引进这些技术时...阅读全文
posted @ 2008-09-02 07:53 炮灰九段 阅读(371) 评论(6) 编辑
摘要: 早期3D游戏的碰撞检测多数基于格子或者BSP树,基于格子的系统实现简单但精度不够,不属于严格意义的3D碰撞检测。基于BSP树的碰撞检测一度十分流行,算法基本已经成熟定型,但是BSP树需要很长的预处理时间不适合加载时计算,管理大型的室外场景很是费力。目前对于任意复杂三角形集合(mesh)的碰撞检测多数基于BVTree(boundingvolumetree),具体可以是aabbtree,obbtree...阅读全文
posted @ 2008-09-01 22:58 炮灰九段 阅读(846) 评论(0) 编辑
摘要: 之前的一段时间是在学习c++与计算机图形学方面的知识,大概的知识体系框架有了,缺的就是往这些框架中填充细节方面的知识。我在总结的最后一段中写到了很多的要有的知识体系。太多太多,现在仅仅了解了一些皮毛而已。真的感觉勇哥puzzy确实是个技术强人,他的讲课已经将这一点全盘托出。我敢说如果过一段时间的看书和备课,我也可以去讲计算机图形学方面的课程,不过在遇到问题后像他那样沉着的讲清个中道理真是不容易。呵...阅读全文
posted @ 2008-08-30 17:02 炮灰九段 阅读(289) 评论(1) 编辑
摘要: 已经连续两次收到某个网络公司打来的调查电话了,主要是调查网络使用的一些问题上一次的时候宿舍的哥们都在,让我马上挂掉,我感觉不是很礼貌就答了几个问题,问题大体是最近再用什么网络门户网站收看新闻信息。我粗略的回答了一下,然后哥们就把电话线拔了,说会没完没了。上周天中午我正要爬上床睡觉听到了电话响,打电话的是个女职员,也是咨询几个问题,这次没人帮我拔线了,我便简单的回答了几个问题。大概是问平时都在用什么...阅读全文
posted @ 2008-08-29 20:34 炮灰九段 阅读(125) 评论(1) 编辑
posted @ 2008-08-28 22:58 炮灰九段 阅读(301) 评论(0) 编辑