• Away3D4.0三维世界的基础


    原帖地址:http://bbs.9ria.com/forum.php?mod=viewthread&tid=132410&extra=page%3D2%26filter%3Dtypeid%26typeid%3D195%26typeid%3D195

      大多数Flash程序员想要接触3D项目的时候,应该都和我一样,最关心的是怎么造一座山,怎么在场景里显示流动的河水,或是怎么让模型动起来(奔跑,攻击,或是跳舞),又或是怎么才能给人物换装,怎么让人物装备武器.但是,请相信我,下面我们所说到的这些名词,在教程真正开始之前,你必须得了解一下,或许它们粗浅的让你觉得根本不值一看,但如果你是一个入门者,能了解一些基础知识,它们终将在未来的某一天帮到你。我会尽量避免使用那些太专业不容易让人理解的词汇,如果哪位朋友觉得下面的内容不对,又或是说的不够,请告诉我,我会在将来不断的修改并完善这些内容,谢谢^^。


    Origin(原心,或称之为起始点): 3D世界与物体的中心点,3D世界中的任何对象都会有一个Origin,不管是场景,3D模型,灯光,还是摄像机,它的所在位置是物体或场景的(0,0,0)坐标,你可能并不能在所有的3D引擎或3D软件(如3dMax)中看到它,但它却是真实存在并起着相应的作用的。


    Geometry(几何形状): 在Away3D中,Geometry类其实就是一个数据对象,它被用来保存3D物体的基础数据,如顶点(vertices),法线(normals),UV数据,我们从外部加载进来的模型文件会被解析成一个Geometry实例并被保存在内存中。

    当然,我们也可以通过实例化一些Geometry的子类来创建一些基础的几何形状数据

    PlaneGeometry        //平面

    CubeGeometry        //方块

    SphereGeometry     //球形

    CylinderGeometry   //圆柱

    CapsuleGeometry   //胶囊


    Material(材质): 我们也可以将它称之为贴图,基本的贴图分三种,颜色贴图,照片贴图和线框贴图(线框贴图仅针对于线框类型对象使用),我们还能为贴图设置透明度和灯光反射强度,以此来达到一些特殊效果。


    Mesh(网格): Mesh是一个容器,如果我们为它设置形状数据和贴图后,我们就可以在场景中看到它,它可以是一个方块,一个圆球,也可以是一个如汽车或楼房这样的复杂模型,当然,它也可以仅仅只是一个点,一根线条,或是一个平面,一切取决于它所包含的Geometry数据内容。


    UV: U,V是贴图坐标的简称(它和3D模型的X, Y, Z轴是类似的),水平方向是U,垂直方向是V,通过这个二维平面的UV坐标系定义了图片上每个点的位置的信息. 这些点与3D模型是相互联系的, 以决定表面贴图的位置. UV就是将图像上每一个点精确对应到模型物体的表面. 在点与点之间的间隙位置由软件进行图像光滑插值处理. 这就是所谓的UV贴图. Normals(法线): 法线并不是一种实体线,它是一条垂直于曲线上节点和表面切线方向上的虚拟线,使用正负值来表示和区别多边形上面和点的法向参数,并且只有法线为正值的点和面在场景中才可见,一般来说,由内部指向外部表示当前位置的法线为正向,如果将表面翻转,也就改变了法线的方向,如果你的模型不是双面显示的话,那么负法向的那一面将会在视力窗口中不可见,并且不可被渲染。


    Light(灯光): 我们生存的这个世界必须有光,不然就是漆黑一片... 3D世界中也一样,但不同的是,我们需要在3D世界中使用有限的几种灯光类型来模拟真实现世界中的大多数可见光源(像红外线这种不可见光源不在我们的讨论之列),目前Away3D 4.0中提供两种光源 PointLight(点光源):这是最常用到的,我们可以用它来模拟太阳,月亮,或是台灯的灯炮 DirectionalLight(投射光源):好吧,这货可以用来模拟探照灯,或是月光透过窗户的效果。


    View3D(视口): 这是整个3D世界的入口,犹如透过一个窗口看世界,Away3D中View3D类就是这个窗口,你可以在Flash中同时添加多个View3D实例,就好像在一面墙上砸出多个窗户一样,每个View3D实例可以指向同一个Scene3D,也可以指向不同的Scene3D,但请记住,即使所有的View3D都指向同一个Scene3D实例,也会造成性能的下降,所以通常情况下,我们只使用一个View3D实例。


    Scene3D(场景): Scene3D就是窗户外的风景,它在Flash的作用类似于Stage,所有的3D对象都需通过它来addChild,才能被显示出来,你也同样可以同时实例化多个Scene3D实例,但每个View3D每次只能被分配一个Scene3D。


    Camera3D(镜头): 我们前面说了窗户和风景,好吧,我承认这比喻有点老套,但想要看到这些内容,还需要你的眼睛,Camera3D就相当于你的眼睛,睛,如果移动Camera3D的坐标就相当于你的眼睛在移动,但....如果移动Scene3D里的物体坐标呢?.....那就说明那个物体在移动......= =!

    //范例:
     
    var view:View3D = new View3D();
     
    //View3D实例必须被添加到舞台上才能正确生效
     
    stage.addChild(view);
     
    
    //创建一个长宽高都为500的立方体数据
     
    var cubeGeometry:CubeGeometry = new CubeGeometry(500, 500, 500);
     
    //创建一个单色的贴图(材质)
     
    var cubeMaterial:ColorMaterial = new ColorMaterial(0xFF0000);
     
    //创建一个可视的Mesh对象,并设置形状数据和贴图
     
    var cubeMesh:Mesh = new Mesh(cubeGeometry, cubeMaterial);
     
    //将mesh添加到舞台上
     
    view.scene.addChild(cubeMesh);
     
    
    //移动风景中的物体
     
    cubemesh.z += 100;
     
    
    //移动镜头,或是说移动你的眼睛....
     
    view.camera.z = 100;

    ObjectContainer3D:
    顺便提一下这个类,ObjectContainer3D类是Away3d中大多数3D可视对象的基类,
    如果你想自己创建一个比较复杂的3D物体对象(如包含好几个Mesh的对象),可以通过继承它来实现自己的需要

  • 相关阅读:
    sql子游标不共享造成的硬解析
    oracle 11g em配置
    论文阅读 Characterization of Multiple 3D LiDARs for Localization and Mapping using Normal Distributions Transform
    获取操作系统设备信息CPU/内存/系统类型
    c#收取获取outlook中的邮件内容
    WebBrowser中注入js后ajax报错No Transport 或message":"拒绝访问。 ","description":"拒绝访问
    30行js搞定js弹div,支持右下弹出div层,左下弹出div层,右上弹出div层,左上弹出div层,定时关闭
    vscode把本地已存在的项目提交到github
    websocket测试工具的环境搭建与使用
    C语言:大小写字母串相互转换
  • 原文地址:https://www.cnblogs.com/njflash/p/2886933.html
Copyright © 2020-2023  润新知