3d引擎_3d引擎 h5 - CSDN
精华内容
参与话题
  • 四大开源3d游戏引擎探究

    千次阅读 2015-10-14 12:32:13
    本人水平有限,只对于长久以来研究的几个经典3d游戏引擎的设计思想、程序架构和应用行深入剖析的结果与游戏开发同行分享,文档有不妥之处请指出,期待我们的共同进步。引擎名称:1. orge(鬼怪)2. Irrlicht(鬼火)...

    本人水平有限,只对于长久以来研究的几个经典3d游戏引擎的设计思想、程序架构和应用行深入剖析的结果与游戏开发同行分享,文档有不妥之处请指出,期待我们的共同进步。
    引擎名称:
    1.       orge(鬼怪)
    2.       Irrlicht(鬼火),
    3.       Nebula(星云)
    4.       klayGE(。。)

    前言:目前,开源3d游戏引擎已经趋近于商业化引擎标准,许多引擎在图形渲染,内存分配,网络通讯方面甚超越了许多商业引擎。这些开源引擎的共同特点是这样的:
    (1)引擎框架:多数的3d引擎框架为树形结构。框架最为清晰、经典的游戏引擎是Nebula星云引擎。父子节点构成了整个框架的层次,首先nebula有一个叫nRoot的类,它是所有对象类的基类,nRoot中有一个名字变量,有一个parent指针指向它的父结点,
      还有一个childlist链表保存它所拥有的子结点.因为结点也是nRoot类,所有结点的子结点中也可能有子结点,
      这样就形成了一个树形目录结构.nRoot中有一个nRoot* Find( const char* name )方法,功能很简单,就是遍历自已的
      childlist链表对比每一个nRoot结点对象的名字,如果相同就返回些对象的指针.。其他引擎也有类似的框架,比如orge的root根节点下面子节点代表每一个功能模块。

    (2)内存管理:多数采取引用计数模式(引用计数为每当初始化一个指针,在函数运行完毕后自动释放,并且把这个过程进行计数)这样的好处在于对于项目的可控性很有保障,避免内存泄漏,重命名对象等。但是这种
    (3)图形处理:多采取三个经典模块:场景管理器,资源管理器,渲染器。这种划分模式以orge鬼怪引擎和irrlicht鬼火引擎最为典型。先进的引擎还配有一套专门从事对于图形编程的脚本语言。比如orge内置一套脚本,可以控制场景管理器,资源管理器的图形参数及图形算法进行编辑,这样可以跳过c++繁冗的程序编写过程和漫长的项目编译时间而直接运行察看修改后程序的效果。当然,这种脚本语言模式有些效仿目前最著名的商业游戏引擎unreal3虚幻3引擎。关于场景的图形算法大多数采用8叉树与bsp(二叉空间分割)方法,支持大游戏场景的局部渲染功能。
    (4)跨平台性:
    本文要介绍的4个3d引擎都具有跨平台开发性能,一般可以支持多种操作系统和开发工具,比如windous下的vs.net,linux下的codewarrior等。而且像irrilicht鬼火这种引擎还支持多种语言,vc,vb等,但是目前版本其本身并无脚本可用。这些引擎还支持多种底层图形api,比如dx,opengl等。开发者可以随意选择熟悉的3d渲染api来驱动游戏程序。注意:KlayGE是本文唯一入选的国产引擎,但该引擎没有支持多api渲染机制,底层图形方面只是用opengl实现。
    (5)网络部分功能较差:目前说到的几个引擎在网络方面都不是很强大,比如著名的orge引擎就是专注的图形引擎,不具备服务器-客户端的网络工作模式。目前,只有北京涂鸦产的起点引擎在网络方面在国产引擎中可以算是比较出色。值得一提的是在网络方面比较强大的商业引擎目前最火的就是bigworld,如果利用适当的渲染算法该引擎可以轻松支撑上百人
    的在线pk。
    (6)可接收多种3d美术资源,比如鬼火引擎可以接受Maya,3DStudio Max,COLLADA,DeleD,Milkshape,Quake 3 levels,Quake2 models,DirectX,Pulsar,My3DTools,FSRad以及Cartography Shop工具导出的资源。但是orge可接受的种类要更多。
    支持骨骼动画和关键贞动画两种经典动画形式。

    好了,目前我们基本了解了市面上著名的3d引擎的基本共同点,那么下面就列举以下他们的特性及优缺点。
    1.Orge鬼怪:
    优点:(1)强悍的图形渲染质量。该引擎的粒子系统很强,制作的光影,雾化效果极佳,图形方面全面超过torque,朱比特等普通商业引擎的能力。
    (2)高效的图形编程机制。内置的特殊脚本语言,并且具有可视化的编辑工具,可以直接进行外部数据修改,内部调试。
    缺点:(1)网络部分的空白
    (2)高度计算量和高精度的渲染模式,使得内存和显存的压力都很大,做出的程序整体效率不高。没有相关随着硬件加速调整渲染算法和参数的api。
    2.Irrlicht鬼火:
    优点:(1)精悍的引擎框架,和orge及其相似。
    (2)高质量的图形渲染,虽然没有orge的质量优越,但是比起一般的商业引擎仍然略胜一筹。
    (3)清晰单一的c++语言实现使得引擎没有繁冗庞大的外部脚本编译器。
    (4)支持根据硬件加速调整渲染模块的参数和算法的机制。整体程序会跑得很快流畅,但是画质降低。牺牲画质来保证性能。
    缺点:(1)缺乏高效开发的脚本。无法像orge那样高质量高效率的进行图形编程。
    (2)相对其它游戏引擎鬼火的框架可扩展性不强,设计模式相对单调而简洁。
    (3)支持图形算法单一,比如骨骼动画多贴图需要很麻烦的过程。

    展开全文
  • Unity3d 引擎原理详细介绍

    万次阅读 2014-03-25 13:22:52
     为了更好地理解游戏的软件架构和对象模型,它获得更好的外观仅有一名Unity3D的游戏引擎和编辑器是非常有用的,它的主要原则。 Unity3D 引擎  Unity3D的是一个屡获殊荣的工具,用于创建交互式3D应用程序在多个...

    体系结构

       为了更好地理解游戏的软件架构和对象模型获得更好的外观仅有一名Unity3D的游戏引擎和编辑器是非常有用的它的主要原则

    Unity3D 引擎

       Unity3D的一个屡获殊荣的工具,用于创建交互式3D应用程序多个平台.Unity3D游戏引擎编辑器该引擎包含的软件组件游戏的研究与开发最常见的和经常性任务发动机涵盖的主题包括声音,图形,物理和网络功能该引擎支持C#Boo和JavaScript脚本编程

    另一个部分是Unity编辑,作为脚本和其他组件包含游戏场景设置和游戏预览窗口(见图4)分层对象检查项目面板集成开发环境它还配备了几个多语言脚本编辑器和一个独特的预制装配系统,将在后面解释

     

                                                              图4:Unity3D编辑

     

    有几个Unity许可证。Unity基本功能有限的免费PCMACWebdevelopment.Other平台完整的功能集[15]需要购买额外的许可证

    虽然有很多免费软件和专有替代游戏引擎虚幻引擎C4引擎选择了Unity的原因如下

    *可以部署在Windows,Mac OSXWeb浏览器,Wii游戏机iPhone,iPad的Android,微软Xbox 360和PlayStation 3它甚至在未来计划增加闪存Linux部署部署possbilities提供很多的可能性使用游戏引擎游戏引擎货币化进一步研究。

     *Unity社区非常支持引擎,以及编辑器是有据可查的

    *发动机是比较容易学习和工作通过提供所有的工具快速原型和迭代以及快速脚本编译支持快速软件开发的想法

    *可能部署的iPhone,iPad和iPod touch的iOS基本许可证其他厂商相比相对低廉的价格创建机甲坦克使用Unity3.0C#脚本和MonoDevelop的IDE进行开发你可以找到一个Unity教程附录

    Unity3D的简史

     下列日期说明2001和2011年[16]之间的Unity引擎的演变
     ◾2001年Unity技术在2001年开始开发自己的游戏引擎当时主要诱因创建游戏这些游戏的基础创造了良好的工具[1]。
     ◾2003在2003年公司,由此产生的引擎将是一个伟大产品本身的
     ◾2005在2005年Unity1推出苹果的WWDC的舞台上
     ◾2007Unity2.0在2007年推出增加地形引擎实时动态阴影和视频播放等等
     ◾2008在2008年推出UnityiPhone卡通网络推出FusionFall,游戏已经播放超过800万人次

     ◾20102010年Unity3.0发布几十个功能,如资产管理和光照贴图

     ◾2011团结超过500开发者和60网络播放器安装。

    游戏架构

     机甲坦克架构组成模块和Unity场景架构

     主要模块

        本节介绍了最重要的模块子系统级别他们关系。游戏的建筑风格是一个对象数据capsules.The下面的UML组件图说明子系统及其关系网络

     

    游戏逻辑

       此模块管理当前玩家AI配置倒计时timerand当前的游戏状态暂停等待网络回复

    AI(人工智能(Artificial Intelligence) ,英文缩写为AI

       AI模块包含背后的逻辑单元球员AI.The单位AI寻路或障碍物避免使用不同转向行为控制单元状态。AI管理组的行为和活动寻路更高的层次上管理播放机的所有播放器模块

    人工智能机器学习保存和加载它的数据使用持久性数据模块的接口

    Persistant data持久性数据

       此模块是负责数据之间不同的游戏sessions.Among其他应可用于保存和加载存储查找表和寻路模块管理学习AIaccumulateddata机器

    Game actors游戏参与者

      游戏参与者在游戏中地形,单位或建筑物他们的3D模型获得通过Unity3D的渲染管线的可视化每场比赛演员拥有AI模块控制它的行为

    Steering behaviours指导行为

      指行为计算力量,影响如何以及如何快速自主游戏代理能动,应该可以用于避障,人流简单寻找任务

    Pathfinding寻路

      模块负责创建一个pathgrid障碍物信息收集提供各种寻路请求aninterface为了获得更好的性能一些信息保存到从磁盘中加载

    Input输入

      此模块跟踪用户的输入对其进行处理生成反馈。

    Network网络

      网络模块负责所有游戏演员状态管理保持比赛状态在两台机器上都保持一致以避免抖动网络单元运动网络game.Another责任

    GUI

     图形用户界面(GUI)显示所有按钮,菜单在小地图倒数计时器它也负责这些元素的功能交互依赖用于此目的游戏逻辑模块

    3D渲染

      该模块主要管理Unity3D的场景的主摄像头确定需要渲染的对象并把它们发送通过渲染管线Unity3D的封装渲染细节而且还提供了通过像素和顶点着色器访问

    Unity场景设置

      在游戏中一个表示Unity3D的场景下面是一个典型的场景设置在Unity层次(一)(二)现场窗口看起来像

                                         

                                                                       Unity层次的地图

                

                                                                              场景视图的地图

    现在所有的游戏对象顶部面板底部进行说明。

    CWalls

      这个对象包含自定义绘制节点和墙壁边缘一种使用自定义绘制墙壁calculatethem取决于地图的几何

    Directional light(定向光)

      此灯仅用于计算地形光照贴图关闭之后由于性能的原因

    Game Music(游戏音乐)

      持有游戏的主要音乐和播放现场启动

    GameController(游戏控制器)

      GameController游戏物体持有管理所有的游戏对象管理游戏的逻辑包括以下对象

    CursorController(光标控制器):

       管理光标的外观和背后的逻辑

    GameInstantiator(游戏实例化):

       这个重要游戏对象负责实例其他对象需要创建非特异性顺序

                      

                                     GameInstantiator in the Inspector

                      

                                       GameController in the Hierarchy

      GameInstantiator持有地图PathCreator路径创建和管理障碍管理球员配置设置是用来处理用户输入InputControl游戏物体游戏场游戏物体和参考玩家游戏物体上的建筑物referenes定义了播放区域的地图

     它还包含玩家的重生点和自定义路径和墙壁引用

    GUI

      拥有地图的所有GUI对象

    Machine Learning Controller

       游戏物体控制的所有功能机器学习需要

    spawn1, spawn2

      实际玩家的重生点重生点的标志是绿色立方体“场景视图  

    HPaths

       定义路径节点在地图边缘定义节点场景编辑标记并概述红线     

    Main Camera(主摄像机)

       现场主摄像头和音频监听所有的3D声音相机的角度观察     

    PlayArea(游戏场)

      定义实际可玩的地图区域

    Base Prefabs(基地预制)

      散落在地图上的建筑物

    Terrain(地形)

       Unity地形对象

    TestRunner

      一个物体,用于运行单元测试Unity3D的单位testingframeworkSharpUnit

    MVC Pattern(MVC模式)

      Unity引擎的设计鼓励MVC模型 - 视图 -控制器面向engineering.In我的情况下结构看起来像这样

     

                                                                  图5:MVC模式体系结构表示

    模型包含了所有的游戏对象组件和数据文件游戏物体渲染器和摄像机对象访问

    视图呈现模型和主要管理Unity3D的引擎渲染它需要accessthe持有模型3D模型,纹理材质和效果它还具有什么输入选项影响

    控制器接收用户输入并调用模型对象方法反应这是在我的游戏中所表示输入子系统用户能影响输入视图

    Multiplatform Development(多平台发展)

      Unity允许部署项目在不同的平台上轻微变化。演示和功能在很大程度上是保持取决于平台的capabilities.However在某些领域在不同的设备上输入机制存在重大分歧

      抽象工厂设计模式应用于设计这些组件

    The Abstract Factory Pattern抽象工厂模式

                                 

                                                                                        图6:抽象工厂模式

    抽象工厂模式(见图6保护客户不同平台上实现相同的概念不同APC与平台是一家集AbstractProduct这些类表示一个概念,是支持所有抽象工厂platforms.An声明创建单一产品经营ConcreteFactory代表一个特定平台

    客户端只使用抽象工厂抽象产品方法,因此一个平台的具体实施保护

    Input and Persistant Data(输入和持久性数据)

       主要有两个方面的游戏不同的实施要求是输入机制和usageof持久性文件数据Unity3D中不支持plattform数据库这就是为什么机甲坦克使用持久性数据在磁盘上二进制文件所有平台得到了他们对于自己的能力自己实施支持的文件格式

     

    为了保持可读性和灵活性以下适应跨平台的输入处理抽象工厂模式

                  

                                                                         图7:输入子系统结构摘自

     

    这仅仅是一个所涉及的所有平台和命令,选择用于演示的摘录

    InputManager附加到游戏物体在场景中InputControl调用CommandImplementorExecute方法的每一帧里面的更新功能执行方法CommandImplementor遍历所有添加命令,检查他们执行情况表示满意,并调用Execute方法,如果是这样

     

    输入子系统组成部分的抽象工厂模式

                 

    iOS+Unity

         机甲坦克被创造的过程迭代开发,这是什么原因为什么游戏已经播放任何调整之前为iPad

         本章介绍分析面临的挑战和解决方案移植机甲和坦克的iPad

    Maximum Polygon Count(最高多边形计数)

         其中一个最明显的限制,适用于iPad™游戏的多边形数量的图形芯片能够呈现每个frame.It横空出世超过30多边形,每帧开始下降,低于25 FPS的帧率对iPad在3D建模软件通过手动消除边缘和应用预定义的算法减少多边形从一开始某些型号甚至rebuiilding减少多边形计数,目前在所有平台上多边形数量是:

                  

    平均多边形数量大约是每单位300如果所有的24个敌人和播放器单元的相机拍摄的在一帧中产生多边形的数量将是7200,平均约8500在最坏情况下24runners.Adding最大4000地形多边形平截头体的其余部分的地形得到扑杀,最重的将给予12500GPU多边形渲染

    Draw Call Reduction and Lights(绘制减少呼叫灯)


    即使在移动设备上不俗的表现,更重要的每帧绘制调用的数量一场平局发出呼叫GPU每次绘制一个模型如果模型有n子网格就会造成至少Ñ战平calls.EveryGUI质地,选择飞机和健康添加一个调用到现场

    额外抽奖调用另一个来源像素光照,导致额外绘图调用一个pass.That就是为什么合并成一个模型中所有子网型号不使用动态照明所有模型和地形纹理的灯光英寸光影烘烤计算每个纹理获取静态光源照亮奠定了光照贴图纹理的亮度看上去好像他们的灯光的影响虽然没有计算模型图8显示了几个模型,而无需光照贴图灯光效果

             

                                      图8:熄灭纹理材质着色器没有灯光烘烤模式截图

            

                                                                    9:游戏扩大统计窗口右上角视图

    这是可以结合Unity若干个对象共享相同的材料制成在运行时在一个单一的绘制调用的绘制在一起这种方法被称为动态配料[18]。图9显示了66战平调用以下来源所造成的一个场景

    (GUI)图形用户界面


    8绘制调用之缩小贴图按钮,,倒计时倒计时文本+24个+8号楼地图+1相机地图现货总结41GUI造成绘制调用

    Terrain(地形)


         4通话其中每个质地

    Visible Models(可见模型)

       14平局呼吁每个模型会导致比3战平调用自身的一个用于单元一个healthbar网格和一个用于选择平面网格数字都可以解释Unity的动态配料

    Terrains(地形)


         Unity3D中没有支持地形为iOS直到Unity3.4发布于2011年7月[19]。为了找到最佳的解决方案机甲坦克,地形实施两种可供选择的方式已经过测试模拟地形在3D程序一个3D建模程序地形分割成不同的部分见图10)分区的效果大部分分部视锥Unity扑杀meansthat只有至少部分可见得到呈现

                             

                                                                                图10:仿照地形突出部分

    这种技术被丢弃创造新的地形,因为这个过程会非常complicatedcompared Unity地形系统纹理大小非常大的质量受到影响*地形地形移动系统移动系统一个解决方案,通过Unity资产商店T4M地形可以用于移动设备可以转换成Unity的地形原来,这个解决方案的性能是不够游戏

    地形最终解决方案使用Unity地形引擎具有非常低的质量设置是唯一可能Unity3.4发布于2011年7月加入Unity地形对移动通信系统支持

    GUI-Optimization(GUI优化)


    Unity引擎提供两种方式来实现GUI一种方式是使用Unity的GUI系统UnityGUI需要它的功能一个特殊的功能calledinside名为OnGUI()执行每帧两次onceevery事件这个系统只用于主菜单,并暂停菜单allvalues​​需要计算OnGUI功能

    GUI纹理用于所有其他GUI元素GUI按钮和小地图上以维持性能GUI纹理平面图像中显示的2D和每帧渲染一次

    Script-Optimizations(脚本优化)


    为了授予脚本的性能便宜的方法进行跟踪profiler.It横空出世被称为最昂贵方法可以通过寻路转向行为子系统寻路已被优化如下文所述在AI部分有人还提出确保昂贵的功能,如转向行为和其他AI程序不会调用每一个帧

    展开全文
  • 学习3D引擎架构技术概述

    千次阅读 2018-05-08 22:04:28
    近期对3D引擎的架构设计做了一个梳理总结,现在开发游戏都离不开引擎,这些引擎包括Unity引擎,虚幻引擎,Cocos2dx引擎,自研引擎等等。很多开发者只会利用他们写逻辑,遇到优化问题就束手无策了,遇到Shader编程...

          近期对3D引擎的架构设计做了一个梳理总结,现在开发游戏都离不开引擎,这些引擎包括Unity引擎,虚幻引擎,Cocos2dx引擎,自研引擎等等。很多开发者只会利用他们写逻辑,遇到优化问题就束手无策了,遇到Shader编程以及优化就感到头疼,长此以往对自己技术提升非常不利的。要改变现有的状态,就必须要系统的学习相关3D引擎技术,这样才能在使用引擎开发产品时得心应手。本篇博客从三个方面给读者做讲解,一是学习3D引擎;二是选择引擎开发产品,三是如何学习一款引擎,下面先从学习3D引擎开始。

    学习3D引擎

       经历过多年的引擎研发和引擎使用,在此我先把学习引擎以及相关技术模块给读者列出来,技术框架图如下所示:


    在上述框架图中共分为七部分,每一部分所包含的技术点并不局限于图中所列,在此一一给读者解释一下:

    第一部分内容:是告诉读者学习3D引擎架构知识的前提,就是要掌握引擎的编写语言和引擎使用的图形库API接口,以及图形学渲染也就是GPU编程使用的Shader语言,基础知识是必须要掌握的。学习时可以参考这些API提供的Demo,把执行流程搞清楚,自己调试一下就可以了。

    第二部分内容: 3D基础知识,比如一个3D模型要在二维屏幕上显示出来,这中间要经历一些矩阵变换才能将其在二维屏幕上显示出来,这种变换过程通常称为固定流水线,就是告诉读者它的显示是按照固定流程,它的计算都是在CPU中完成的;对应的就是可编程流水线,也就是在GPU中完成,其实就是将矩阵变换放到GPU中计算了。

    第三部分内容:3D游戏引擎的技术点,在掌握了第二部分内容后,再开始学习第三部分内容,该部分内容针对的是DX的SDK或者OpenGL的SDK,二者都提供了Demo供读者学习,我们要把这些基础的3D引擎技术掌握,最好的方式是自己用手把代码敲一遍,调试一下。

    第四部分内容:需要一定的数学知识,引擎的开发或者游戏的开发离不开算法的支持,当然大家也不用对其产生畏惧心理,学习任何事情都不是一蹴而就的,循序渐进的,先从基本的数据结构入手,逐步深入,图中列出的几种算法是引擎中常用的算法,四叉树或者八叉树可以用作地形的绘制,插值算法可以用于实现刀光拖尾等等,A*算法比较经典是寻路使用的,另外还有后处理算法实时阴影的网上都有很多现成的案例。

    第五部分内容:这部分内容是核心的架构设计,图中所显示的是组成引擎的各个模块,场景管理模块,该模块非常重要,地形的加载通常是通过分块的方式处理的,比如魔兽地图,显示的是9块,在缓冲中的是16块,随时提供加载,场景中少不了水的渲染,这个也体现了引擎的技术层次,大家可以看看虚幻水的渲染,达到了一个顶级水准。模型插件也是必须的,Unity和现在开源的虚幻使用的都是AutoDesk提供的FBX模型,AutoDesk提供了FBX的API可以直接使用,当然自己也可以开发适用于自己引擎的模型插件,自定义格式。AI模块这里主要是指行为树算法,各种各样的灯光模块也是必须的,对应的就是相机模块,比较常用的是透视摄像机和正交摄像机,特效和UI也是引擎的组成部分,剩下最重要的是物理引擎模块,碰撞检测处理,常用的碰撞算法:Mesh碰撞,球体碰撞,胶囊体碰撞,立方体碰撞,这些碰撞算法的核心是OBB或者AABB算法,当然还有肉体碰撞处理,另外,引擎很重要的部分是关于内存管理,这部分内容将在后面的博客中介绍。

    第六部分内容:3D引擎中的GPU编程,这个是令大部分程序员头疼的问题,不同的引擎使用的渲染算法是不一样的,它们主要区别还是在细节贴图方面的区别,以UE4为例,他渲染一个物体使用的材质相比Unity多一些,通过它们渲染的物体就可以看出来。快速的学习GPU编程,网上都有对应的Shader代码,可以直接在此基础上修改。还有可以直接使用Shader编辑器用于Shader的编写,调Shader效果我们可以参考Max或者Maya模型工具中的渲染效果,Max或者Maya中都有渲染Shader,它们功能很强大,引擎是无法与其攀比的,只能与其无限靠近。而且Max和Maya可以为我们提供使用了哪些Shader。该部分内容主要是针对模型的材质渲染。

    第七部分内容:主要是针对引擎的后处理渲染,常用的有PSSM,HDR,Blur,Deferred等等,这些效果是在游戏的每帧图像显示之前再进行一遍后处理渲染,然后显示出来,这就是后处理渲染效果。

    上图只列举了七部分内容,还有一个技术点,开发者要掌握——设计模式,与引擎开发相关的设计模式比如:单例模式,工厂模式,观察者模式,状态模式等等吧,只要能熟练掌握这些就足够了。上面框架图是给想学习引擎的读者推荐的,作为游戏开发者来说,学习引擎对自己技术提升帮助还是非常大的,不要只局限于逻辑的编写,要想成为主程,技术经理,技术总监必须要学习引擎技术。

    以上是关于读者自己学习引擎的内容,现在网上有很多开源引擎,比如:Ogre引擎,虚幻引擎。。。。。

    面对这么多开源引擎,作为读者如何去选择一款适合自己产品研发的引擎至关重要。

    选择适合项目的引擎

      开发产品首先要做的事情是选择引擎,市面上很多引擎供读者使用,游戏产品从大的方面说是页游,端游,手游;从表现形式来说有2D,3D之分。不同的产品设计对应着不同的引擎选择,现在H5游戏逐步出现了,相关的H5引擎也跟着出来了,比如:白鹭,layaBox,cocos-js。2D引擎目前还是cocos2dx引领,3D引擎的选择有Unity3D引擎和虚幻引擎,二者最大的区别是一个开源,一个不开源,当然掌握难度要看不同的人使用。选择引擎首先要考虑的问题是:

    一、是该引擎是否有对应的上线产品出来,可以去下载玩玩,体验一下。

    二、与该引擎相关的工具是否完备,比如场景编辑器,特效编辑器。。。。

    三、该引擎上手是否比较快,这个也是重点考量的;

    四、该引擎相关的文档是否完整或者详细,另外对应的论坛或者社区是否能够快速响应;

    五、不同的机型适配性是否满足项目需求;

    六、功能扩展性,这个涉及到代码的开源了,有第三方库并且支持第三方库开发;

    七、对引擎支持的场景面数以及骨骼动画,特效做一个压力测试;

    选择引擎一定要根据自身项目需求来定,这个也关系到项目成败,比如做一些3D仿真项目,要求品质比较高,这个就要考虑虚幻引擎了,当然使用的人必须具备C++编程能力,否则即使你选择对了引擎,但是项目组的人不会用也是不行的。

    3D手游开发,这个选择Unity引擎开发,Unity引擎的优点这个大家都知道,就不介绍了,当然缺点也比较明显。

    选择好了引擎,如何学习一款引擎,因为你不能保证项目组的每一个人都会使用。

    学习一款引擎

     选择好了引擎后,下面就要开始学习了,学习一款引擎可以从先整体后部分,或者说先粗后细的原则。

    首先,看一下这款引擎的文档,它主要能解决啥问题。

    其次,引擎的架构设计图,从整体上对整个引擎有所了解,以及类层次关系。

    以上是粗看,目的是至少做到对引擎有个整体的概念。下面就是细看了,

    先从引擎提供的官方Demo入手,把整个执行流程通过调试的方式学习一下,在此过程中也能了解引擎使用的坐标系以及模型格式,模型插件等等吧。而且能对场景的加载处理都有所了解,通过调试的方式可以深入到引擎内部,假设该引擎提供了源代码。下一步再demo的基础上尝试做一些修改,加一些功能,加深对引擎的理解。

    对于程序开发者来说,市面上比较常用的引擎技术都是相通的,深入理解了一款引擎,再学习其他引擎就很容易了。我以前是做端游开发的,端游开发的经验对我开发手游帮助很大,我自己也写过引擎,自研引擎的经验对于使用Unity引擎和虚幻引擎这些成熟引擎开发产品就非常容易了。

      开发者在学习引擎时,可以先从Ogre引擎入手,该引擎对与渲染做的比较好,而且该引擎没有其他杂七杂八的东西,比较干净非常有助于开发者学习。以前用Ogre引擎开发过比较著名的端游是《天龙八部》,效果也是不错的,证明该引擎可以用于商业开发,本篇博客只是从大的方面给读者聊了聊3D引擎技术,下一篇给读者介绍关于GPU编程优化的问题。




    展开全文
  • 3D游戏引擎系列三

    千次阅读 2017-01-27 17:30:33
    已出版书籍:《手把手教你架构3D游戏引擎》电子工业出版社和《Unity3D实战核心技术详解》电子工业出版社等。CSDN课程视频网址:http://edu.csdn.net/lecturer/144 笔者以前在游戏论坛担任过技术版主,以及在51CTO...

    笔者介绍:姜雪伟,IT公司技术合伙人,IT高级讲师,CSDN社区专家,特邀编辑,畅销书作者,国家专利发明人;已出版书籍:《手把手教你架构3D游戏引擎》电子工业出版社和《Unity3D实战核心技术详解》电子工业出版社等。

    CSDN课程视频网址:http://edu.csdn.net/lecturer/144

    笔者以前在游戏论坛担任过技术版主,以及在51CTO教育网,CSDN教育网,泰课在线等教育网站担任过高级讲师,跟学员或者网友经常讨论技术问题,很多人向我请教向量和矩阵在游戏开发中如何解决实际问题,为此我单独做了一些关于3D数学知识的课程讲座:《3D游戏开发基础知识》,《3D数学在Unity中的运用》、以及《3D游戏引擎架构与设计》等视频课程的讲解。旨在帮助刚接触游戏行业以及对游戏开发刚入门的初级人员,其实这些知识在大学里面已经学过了,现在参加工作了,要将所学知识运用到实践开发中。不论是3D引擎开发还是游戏逻辑开发都离不开数学理论知识的支撑,单纯的数学理论知识是非常枯燥的,从本章开始将数学知识与游戏开发的实际案例结合起来讲解。将游戏中常用的向量,矩阵,四元数以及齐次坐标等一一给大家介绍,希望对大家有所帮助,接下来先从向量开始。

    向量是所有3D引擎算法的基础,因此对游戏程序员来说掌握向量的运算非常重要,向量的基本运算包括向量的加法,减法,点乘,叉乘,向量单位化等。向量是由多个分量组成,根据分量个数的多少,分为2D向量,3D向量,4D向量等。向量表示的是一条有向线段,是从一个点到另一个点的有向线段,定义的向量总是相对于原点的,而且向量是有方向和长度的。在2D游戏和3D游戏中定义的点分别是用两个量和三个量表示的,顶点与向量有何区别?单从外形上看二者是一样的,顶点和向量的区别会在后面的齐次坐标里面给大家详细的讲解。接下来介绍向量的表达式:2D向量指的是由两个参数组成,表达式为u= <x,y>,3D向量是指由三个参数组成,表达式为u = <x, y, z>,4D向量表示为u =<x, y, z, w>也称为齐次坐标,5D向量就是五个参数……。以2D向量为例,如下图:


    在坐标轴中有两个向量a,b,,二者是有方向的。

    向量加法指的是两个向量的分量对应相加,简单的说两个向量相加的和就是以两个向量的边作为平行四边形长边的对角线表示,向量加法的表达式:,在坐标系的表示如图:


    对角线长的表示两个向量相加,知道了向量相加的公式,接下来看看它在游戏编程中经常用在哪里?或者说在游戏里面是如何运用的呢?看图2-3所示,图中有两个对象:一个是玩家,另一个是怪物,假设玩家具有自动寻找目标攻击技能,玩家是如何做到自动去攻击怪物呢?已知玩家在3D场景的坐标 ,怪物在3D场景中的坐标是 。为了让玩家能自动寻找到怪物,第一步要确定玩家追击的方向,这个方向如图:


    所绘的从玩家指向怪物的箭头,用公式表示为:,计算的结果是玩家追击怪物方向的单位化,方向是没有大小的,故进行单位化操作。取得玩家移动的方向后,接下来要计算玩家移动到靠近怪物的位置去攻击,这要用到向量的加法运算,玩家移动到怪物的位置是根据时间移动的,所以要在游戏运行的每一帧里面去调用,算式表达式:;这样玩家就会朝着敌人追击过去,当然在玩家移动的过程中可以加入玩家动作。还可以在移动算式前加个判定二者距离远近的表达式,计算玩家移动到距离怪物多远处停止,避免二者重叠在一起。这样利用两个向量的加法运算实现了玩家移动,是不是非常简单?

    向量减法与加法正好相反,对应的是两个向量之间的各个分量相减,向量减法公式表示为:。如图坐标系所示:


    对角线短的表示两个向量相减,向量减法是与向量单位化和平方根紧密相关的。向量减法主要应用在两个方面:其一、减法可用于方向的计算,其二、减法也用于判断两个物体之间的距离。向量减法在游戏中的应用是非常广泛的,游戏中物体向另一个物体靠近时,首先要做的是将这个物体朝向另一个物体移动,比如在射击游戏里面,发射导弹追踪目标,由于目标是在不停的移动中,导弹必须不断的修正其朝向目标的方向。它的本质就是向量的减法计算,如图所示:


    物体在下降的过程中导弹一直追踪着目标最后将其击毁。利用两个向量相减计算距离在游戏中也经常使用,比如怪物追踪玩家,在一定的距离之内它会锲而不舍,超过某个距离值,它就会放弃追踪返回出生地。距离的计算也是通过向量减法再平方根求得公式会在后面给出,在AI算法中也经常使用追踪策略,这样的案例很多在此就不一一列举了。

    向量点积主要是用于角度的计算,向量的点积计算公式:u∙v = |u|∗|v|∗cos(theta),向量u的长度乘上v的长度再乘上u与v之间夹角的余弦。它的几何意义是u的长度与v在u上的投影长度乘积,或者是b的长度与a在b上的投影长度乘积,它是一个标量,有正负之分,互相垂直的向量的内积为0。如图坐标系所示:


    点乘在游戏中是如何运用的?假设在游戏中玩家看到了某个怪物在自己位置的某个方向,如果它要正视怪物需要旋转一定角度才能正面看到,那这个角度的计算要用到向量的点积。利用点乘公式:u∙v = |u|∗|v|∗cos(theta),可以推导出cos(theta)= ,这样玩家就得到了旋转的角度,接下来只要让玩家旋转theta角度,当然为了转向平滑使用插值就可以了。

    除了在游戏逻辑开发中使用,在GPU编程中也经常用到,开发卡通游戏时要对物体材质进行卡通渲染,在顶点着色器中进行漫射光计算,即计算顶点法向量N和光线法向量L的点积以确定其夹角是大于90度还是小于90度,如果夹角大于90度表示不接受光照,否则夹角小于90度接受光照,从而实现卡通渲染着色的明暗效果。卡通渲染要创建一个带强度级别的灰度纹理如图所示,以达到卡通绘画中的阴影过度效果。


    下面摘取Shader代码的一部分VS代码片段用于展示向量的点乘运算:

    VS_OUTPUT vs_main( VS_INPUT Input )
    {
       VS_OUTPUT Output;
     
       Output.Position = mul( Input.Position, matViewProjection );
      
       float3 posW    = mul( matView, Input.Position );
       float3 normalW = mul( Input.Normal, matView);
      //通过光向量L与法向量N的点积,确定顶点接受的光线
       float diffuse = max(0, dot(vecLightDir, normalW));
       Output.Texcoord.x = diffuse;
       Output.Texcoord.y = 0.0f;
      
       return( Output );
      
    }
    

    下面语句是计算顶点接受光线函数:

    float diffuse = max(0, dot(vecLightDir, normalW))

    公式中dot函数用于计算顶点法向量N和光线法向量L的值,然后将其值作为纹理坐标x的值。卡通渲染的效果如图所示:


    中间亮度大的表示顶点法向量N和光线法向量L之间的角度小于90度,暗的地方表示二者角度大于90度。

    向量叉积计算是直线和线段相关算法的核心部分,下面通过一个例子给大家普及一下基础算法。假设向量P = ( x1, y1 ),Q = ( x2,y2 ),则向量叉积定义为:P × Q = x1∗y2 - x2∗y1,其结果是一个标量,显然有公式 P × Q = - ( Q × P ) 和 P × ( - Q ) = - ( P × Q )。

      叉积的一个非常重要性质是:通过它的叉乘符号判断两向量相互之间的顺逆时针关系:

      若 P × Q > 0 , 则P在Q的顺时针方向。

      若 P × Q < 0 , 则P在Q的逆时针方向。

      若 P × Q = 0 , 则P与Q共线,但可能同向也可能反向。

      叉乘还可以用于折线段的拐向判断:折线段的拐向判断方法直接由向量叉积的性质推出,对于有公共端点的线段p0p1和p1p2,通过计算公式:(p2 - p0) × (p1 - p0)的符号便可以确定折线段的拐向:

      若(p2 - p0) × (p1 - p0) > 0,则p0p1在p1点拐向右侧后得到p1p2。

      若(p2 - p0) × (p1 - p0) < 0,则p0p1在p1点拐向左侧后得到p1p2。

      若(p2 - p0) × (p1 - p0) = 0,则p0、p1、p2三点共线。

    它们在图中的表示:


    在算法中经常需要判断是凸多边形还是凹多边形,这个也可以通过叉乘去实现。以两条边作为向量进行叉乘,如果全部大于等于零则是凸多边形,如果全为零则是所有边共线,否则小于零则是凹多边形。

    用叉乘判断也可以判断点是在线的上方还是下方?,计算这两个点在线的上方还是下方? 四个点坐标如图所示:


    的向量表示为_ac_V, 的向量表示为_bc_V, 的向量表示为_ad_V, 的向量表示为_bd_V。用向量的差乘计算公式:如果_ad_V×_bd_V二者的叉乘计算结果大于零表示点在 直线的下方, 如果_ac_V ×_bc_V二者的叉乘所计算结果小于零是在直线的上方。以上计算公式可以运用到游戏中的AI算法里,在游戏中向量的叉乘主要用于判断玩家和怪物方位关系,以及具体到可以判断玩家是向左转还是向右转朝向敌人。

    下面继续叉乘算法介绍,判断一个点是否在矩形内部,假设矩形四个顶点P1, P2, P3,P4,判断点P是否包含在矩形里面。只要判断如下表达式是否小于等于零:|P2P| ×|P1P2|*|P2P| ×|P3P4| <= 0 和|P1P|×|P1P4|*|P2P|×|P2P3|<=0。如下图

    为了能让读者理解向量的叉乘,在此多举了几个例子,也为了能让读者在此基础上举一反三,同时说明向量的叉乘应用是非常广泛的,所以必须要重点掌握。本书对于重点的章节介绍的案例比较多,对于应用少的知识点一笔带过,本书还是以实用为主。

    向量的长度计算公式是:,在网络游戏中经常计算向量之间的距离,游戏中为了增加可玩性需要给怪物一定的AI功能,比如魔兽世界中的怪物追踪算法是计算怪物跟出生地距离超过一定数值它就会返回,还有射击游戏中枪支也会根据距离去使用,比如手枪射击的距离比较短,狙击枪射击的距离比较远,这些都会用到向量距离的计算。

    在上几节向量运算中都使用过归一化计算公式,归一化计算方式是把向量的各个分量除以二者的长度,归一化公式:v = u / |u|,|u|表示向量长度。长度的计算前面已经讲过了,u表示向量,归一化向量主要是运用在方向的计算上,它与大小没有关系。在游戏里向量归一化主要运用于方向上的计算,比如怪物追踪玩家的方向,在前面中已经讲过,在这里就不重复了。

    向量的计算在游戏中应用还是非常广泛的。关于向量的基本运算:点乘,叉乘,单位化在游戏中使用的最多。如果读者对这部分知识还不是很清楚,建议去学习一下《线性代数》,把基础夯实。本章的主要目是教读者把所学的知识灵活的运用到游戏开发中去,真正的做到学以致用,当然在此基础上读者还可以进一步的去拓展。本章讲述的向量运算在游戏中的运用相对来说比较初级,对于向量的复杂运算是把向量的各个运算公式综合运用到程序开发中。关于向量的运算全部讲完了,从下节开始讲述关于矩阵的运算。


    展开全文
  • 手把手教你架构3D引擎高级篇系列三

    千次阅读 2018-09-11 14:55:41
    Unity对于开发者来说是一个黑盒子,开发者只需掌握引擎提供的脚本语言,能够熟练运用就可以了,这导致了现在很多程序员对于C++编程或者说对于引擎只会一些表面的东西,深入的一概不知。久而久之,你就只是一个脚本...
  • 手把手教你架构3D引擎高级篇系列一

    千次阅读 2018-09-09 08:23:54
    最近一段时间事情比较多,从本篇博客开始,我手把手教大家如何开发一款类似商业引擎Unity的开发,我们在这里要阅读学习一些编写引擎的知识,编写引擎之前,我们需要安装Visual Studio VS2017,Windows操作系统是64位...
  • 开源3D引擎介绍

    万次阅读 2011-11-14 21:49:24
    Delta3D:Delta3D是一个功能齐全的游戏引擎,可用于游戏,模拟或其他图形应用。其模块化设计集成了其他的开源项目,如‘开放场景图’,‘开放动力学引擎’,‘人物动画库’和‘OpenAL’ 。Delta3D把这些开源项目集成...
  • 手把手教你架构3D游戏引擎

    千次阅读 热门讨论 2017-08-23 09:39:29
    在这里将多年游戏研发经验的积累写成一本书奉献给读者,目前已经开始预售,网址: ... 该书主要是将游戏中经常使用的技术给大家做了一个总结,书中的代码可以直接应用到项目开发中。
  • 几款流行Flash3D引擎对比介绍

    万次阅读 2012-08-16 01:17:03
    05/2012 Tag in away3d,flash3d ...10日,Adobe页游峰会最后一站—-广州站顺利举行,本次北上广的Adobe页游峰会活动也圆满划上句号,活动围绕3D...3D页游的开发,离不开Flash3D引擎的选择,现在流行的Flash3D引
  •  文章链接: http://blog.csdn.net/zhmxy555/article/details/8250057作者:毛星云(浅墨) 邮箱: happylifemxy@163.com 看到在留言中很多朋友提到不太清楚DirectX与游戏引擎的区别的问题,在这里浅墨就专门把...
  • 十个3D 游戏引擎,html h5 js

    千次阅读 2020-01-13 23:18:54
    由于很多人都在用JavaScript、HTML5和WebGL技术创建基于浏览器的3D游戏,所有JavaScript 3D游戏引擎是一个人们主题。基于浏览器的游戏最棒的地方是平台独立,它们能在iOS、Android、Windows或其他任何平台上运行。 ...
  • 典型开源3D引擎分类比较

    万次阅读 2016-06-24 10:43:57
    常见的3D引擎有:Unreal,Quake,Lithtech,OGRE,Nebula,Irrlicht,Truevision3D...等,其中开源免费的有:orge,irrlicht,fly3d, NeoEngine, revolution3d, Nebula2,Genesis3d等。OGRE 在免费、开源的引擎中评价最高...
  • 5个最佳的3D游戏开发工具

    万次阅读 多人点赞 2012-11-28 23:48:42
    5个最佳的3D游戏开发工具作者:chszs,转载需注明。...它不是一个简单的过程。但是近几年来,技术越来越先进,游戏...1) UDKUDK是虚幻引擎3的免费版本,提供了一个高质量的3D游戏引擎和专业的工具集,可以用于视频游戏开发
  • Panda3D引擎简介跟初步体验

    千次阅读 2010-05-24 13:14:00
    最近在为公司项目寻找一个合适的开源3D引擎,一开始想到的就是OGRE,irrlicht这些。由于公司里没用人接触过3D引擎,甚至连熟悉C/C++的人也只有一个。此外,基于团队现状,像OGRE之类的纯粹的图形引擎肯定是不考虑了...
  • 最常见的开源游戏引擎

    千次阅读 多人点赞 2015-05-11 15:24:53
    开源即开放源代码(Open Source),游戏引擎好比赛车的引擎,是用于控制所有游戏功能的主程序,从计算碰撞、物理加速系统和物体的相对位置,到接受玩家的输入,以及按照正确的音量输出声音等等。无论是角色扮演游戏、...
  • 3D图形软引擎开发总结

    千次阅读 2014-05-06 17:30:00
    前言 经过几个月的学习,终于将这个3D图形软引擎基本制作完成了。在这个过程中,
  • 【游戏开发】免费开源游戏引擎

    千次阅读 2018-11-07 12:00:55
    开源即开放源代码(Open Source),游戏引擎好比赛车的引擎,是用于控制所有游戏功能的主程序,从计算碰撞、物理加速系统和物体的相对位置,到接受玩家的输入,以及按照正确的音量输出声音等等。无论是角色扮演游戏、...
  • 介绍Unity3D引擎的几个亮点

    万次阅读 2011-05-07 19:11:00
    作为使用Unity3D引擎将近一年,并且已经有一个产品的程序。我总结一下这个引擎成功的几个地方:1.当其他引擎专攻PS3,XBOX360等主流成熟平台的时候,Unity3D敏锐的抓住市场潮流,专攻Web,Iphone等前沿小众平台,...
  • 各种Java游戏引擎简介

    万次阅读 2012-08-28 22:08:15
    各种Java游戏简介 JME(jMonkey Engine): JME是一个高性能的3D图形API,采用LWJGL作为底层支持。它的后续版本将支持JOGL。JME和Java 3D具有类似的...JME(java Monkey Engine),一个非常棒的Java游戏引擎。一直以
  • 用Unity3d开发游戏的优点都有哪些?

    万次阅读 2017-11-24 17:04:11
    unity3D是如今绝大多数游戏开发团队的首 选3D引擎,并且它在2D上的表现也及为优秀。它可以轻松解决很多其它引擎不能解决的问题,此外还有很多出众的地方,这都是现在越来越多的人选择unity3d游戏开发的原因,下面就...
1 2 3 4 5 ... 20
收藏数 81,827
精华内容 32,730
关键字:

3d引擎