第一个PV3D App

2024-05-04 18:48
文章标签 app 第一个 pv3d

本文主要是介绍第一个PV3D App,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!



 我们开始写 Papervision3D 的代码前,我们需要知道更多一些 Papervision3D 面的 3D.接
下来的这部分会让你更明白所写的那些代码.这些概念跟 Papervision3D 用到的类有直接关系.本
章,将使用这些来完成第一个应用.我们所说的对象都是 3D 场景里活动的元素.让我们看一下这些
对象:

 

场景 Scene
    Scene 是在 3d 空间由 3d 对象组成的一个整体.就如 flash 里有 3 个轴的舞台(stage)-x,y,z.
每个可视对象都可以添加到场景.如不添加到场景中就不会在出现在屏幕上.
摄影机 Camera
  可以想象成一个真实的相机,它在 3d 空间中不断的记录场景的活动.摄影机确定了查看场景的
点.因为3d空间的相机不是可视对象,它不是场景的组成部分不必添加它.摄影机可以像真实的相机
一样缩放和聚焦.
 3d空间的相机可以做更多的事.如,在3d中对象距离相机过近或过远时将剔除此对象防止它被
渲染.相机可以忽略某些在不可见区域的对象.这些都是出于性能考虑的.对象距离太远或处于相机
后面,不需来记录,这时会节省很多计算的资源.
观察口 Viewport
观察口是一个舞台上的sprite容器,输出相机记录下来的对象.对象介绍中,观察口好比相机的镜头.
镜头是我们放在 3d 场景上面的窗口.
我们可以缩小这个窗口则可以只看到 3d 场景的一小部分,放大一些就看的多一些.观察口如现实中
真实窗口一样—窗口越大看到的外面世界越大,它影响到我们究竟可以看到多少场景.
 下面的图解包含了一个大的观察口,右侧是一个小而宽的观察口.黑边框画出了观察口区域.右
侧的图很好的说明了观察口如何影响我们所看到的物体.



 

3D对象
在 3d 空间中的图形被称为一个 3d 对象,在 Papervision3D 中叫 DisplayObject3D.可以将其想
象成一个更高级的可视化对象如 sprite 和 movieclip.不同的是 DisplayObject3D 有第三个轴,
我们可以让其绕 3 轴进行旋转.
材质 Material
  材质是附着在对象表面上的结构.当对象没有附着材质时,它是不可见的.可以使用很多材质.如

 一个简单的材质:颜色;高级的材质可能是:流(live stream).第四章会用到所有的材质.
渲染引擎Render engine
渲染引擎像一个滚动的相机.只要渲染引擎开始工作,它会输出相机记录下来的信息给观察口.
当停止渲染引擎时观察口不会有任何新的信息输出仅仅会看到最后的那张图像.渲染是计算机中最
繁重的任务,它需要重复计算你场景内部的对象并输出他们到观察口去.
左手定则笛卡尔坐标系
Flash,Papervision3D,都使用笛卡尔坐标系.在 Flash 中,一个规则的可视化对象可以通过设置
x,y 值改变其在舞台的位置.对象依靠 x,y 的值与舞台左上角的关系来确定位置.x 值越大对象越靠
右,y 值增大对象便向下移动.
 Papervision3D 里面的坐标系工作一致,只有 2 点不同之处.
  Flash 使用了笛卡尔坐标系的 2 个轴,而 Papervision3D 使用了 3 个轴
  Papervision3D 里的y 轴与 Flash 里面的 y 轴相反.
在 Papervision3D 中,我们不但要设置可视化对象的 x,y 轴,还要设置其额外的轴,为了确定对
象的深度.第三轴称为 z轴.
  在 Flash 中,依靠左上角的关系来摆放对象,这点是(0,0).称为中心点或原点.可想而
知,Papervision3D 中的原点是(0,0,0).



 
图中(+,-)的标志说明了坐标值相对于原点是增加还是减少.[注意]y 轴与 Flash2D 坐标系是相
反的.若准备将对象放置到屏幕的下方,需要给 y 轴更大的值.这是 2D 坐标的工作情况.上面的
图解说明了 Papervision3D 坐标系里的 y 轴情况.
(注:这样想 Flash 的坐标原点在屏幕的左上角,Papervision3D 的坐标原点在屏幕的左下角)
创建一个基础的 Papervision3D类
前面学习了基础场景的使用,和如何创建自定义类.现在我们要开始实践.
 使用你顺手的工具.第一个应用我们将创建一个3D场景包含一个可绕y轴旋转的球体.球
体是 Papervision3D 内置的一个基本体.
基本文档类
首先,看一下定义了旋转球体应用结构的文档类.

 

package { import flash.display.Sprite; import org.papervision3d.cameras.Camera3D; import org.papervision3d.objects.primitives.Sphere; import org.papervision3d.render.BasicRenderEngine; import org.papervision3d.scenes.Scene3D; import org.papervision3d.view.Viewport3D; public class FirstApplication extends Sprite { private var scene:Scene3D; private var viewport:Viewport3D; private var camera:Camera3D; private var renderEngine:BasicRenderEngine; private var sphere:Sphere; public function FirstApplication() { scene = new Scene3D(); camera = new Camera3D(); sphere = new Sphere(); scene.addChild(sphere); viewport = new Viewport3D(); addChild(viewport); renderEngine = new BasicRenderEngine(); renderEngine.renderScene(scene,camera,viewport); } } 
} 

 

 

现在细说下,我们可以在 Flash,Flexbuilder,FlashBuilder 中建立一个新工程之后创建一个
名为 FirstApplication 的文档类.不要忘记在 FlexBuilder,FlashBuilder 中导入
Papervision3D 的代码.
此前,我们了解到要把渲染结果输出到屏幕上我们需要一个 场景,摄像机,观察口,有材质的 3d
对象,和一个渲染引擎.[注意]文档类需要继承 Sprite.之前我们需要将其引入.
 
import flash.display.Sprite;
import org.papervision3d.cameras.Camera3D;
import org.papervision3d.objects.primitives.Sphere;
import org.papervision3d.render.BasicRenderEngine;
import org.papervision3d.scenes.Scene3D;
import org.papervision3d.view.Viewport3D;
 
现在,引入完毕,我们开始定义变量.
private var scene:Scene3D;
private var viewport:Viewport3D;
private var camera:Camera3D;
private var renderEngine:BasicRenderEngine;
private var sphere:Sphere;

我们只是定义了变量,并没有赋初始值.我们在构造器中进行赋初值.
public function FirstApplication()
{
}
现在开始创建一个 3D场景.场景是必须的,是 3D 对象的载体.
  scene = new Scene();
创建了一个无参的 Scene3D 类的实例.
接着,添加一个 Camera3D,跟创建场景一样容易.
camera = new Camera3D();
摄像机在创建时可以指定参数,现在使用默认值.只要场景中没有 3D 对象,场景和摄像机都很
少用到.本例用到了一个内置的球体.
 sphere = new Sphere();
Camera和Sphere 都可以在创建时指定参数,若不指定则自动使用默认值.
现在我们的球体创建完毕,需要加入到场景中,否则摄像机无法观察到它.如同在 Flash 中添加
规则对象的步调一致,通过使用 addChild().
  scene.addChild(sphere);
看起来很像,对吗?
现在我们拥有了一个场景,一个摄像机,和一个球体,现在我们需要建立好可以观察到 3D 场景
的窗口.我们需要定义观察口并将其加入到舞台以使其可见.
 viewport = new Viewport3D();
 addChild(viewport);
创建新观察口时,我们可以传递可选的参数,否则观察口将使用默认的参数.
 现在距离完工只有一步之遥了.我们需要获取到我们滚动的摄像机.这是渲染引擎定义好
的,它将渲染场景并将拍到的图像发送至观察口.
renderEngine = new BasicRenderEngine();
renderEngine.renderScene(scene,camera,viewport);
现在用渲染场景指令来渲染场景.运行后会得到一下的图像:



 

这篇关于第一个PV3D App的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/959870

相关文章

macOS怎么轻松更换App图标? Mac电脑图标更换指南

《macOS怎么轻松更换App图标?Mac电脑图标更换指南》想要给你的Mac电脑按照自己的喜好来更换App图标?其实非常简单,只需要两步就能搞定,下面我来详细讲解一下... 虽然 MACOS 的个性化定制选项已经「缩水」,不如早期版本那么丰富,www.chinasem.cn但我们仍然可以按照自己的喜好来更换

React实现原生APP切换效果

《React实现原生APP切换效果》最近需要使用Hybrid的方式开发一个APP,交互和原生APP相似并且需要IM通信,本文给大家介绍了使用React实现原生APP切换效果,文中通过代码示例讲解的非常... 目录背景需求概览技术栈实现步骤根据 react-router-dom 文档配置好路由添加过渡动画使用

好题——hdu2522(小数问题:求1/n的第一个循环节)

好喜欢这题,第一次做小数问题,一开始真心没思路,然后参考了网上的一些资料。 知识点***********************************无限不循环小数即无理数,不能写作两整数之比*****************************(一开始没想到,小学没学好) 此题1/n肯定是一个有限循环小数,了解这些后就能做此题了。 按照除法的机制,用一个函数表示出来就可以了,代码如下

Spring Roo 实站( 一 )部署安装 第一个示例程序

转自:http://blog.csdn.net/jun55xiu/article/details/9380213 一:安装 注:可以参与官网spring-roo: static.springsource.org/spring-roo/reference/html/intro.html#intro-exploring-sampleROO_OPTS http://stati

使用gradle做第一个java项目

涉及到的任务如下: assemble任务会编译程序中的源代码,并打包生成Jar文件,这个任务不执行单元测试。 Total time: 5.581 secs E:\workspace\Test>gradle assemble :compileJava :processResources UP-TO-DATE :classes :findMainClass :jar :b

MFC中App,Doc,MainFrame,View各指针的互相获取

纸上得来终觉浅,为了熟悉获取方法,我建了个SDI。 首先说明这四个类的执行顺序是App->Doc->Main->View 另外添加CDialog类获得各个指针的方法。 多文档的获取有点小区别,有时间也总结一下。 //  App void CSDIApp::OnApp() {      //  App      //  Doc     CDocument *pD

vue2实践:第一个非正规的自定义组件-动态表单对话框

前言 vue一个很重要的概念就是组件,作为一个没有经历过前几代前端开发的我来说,不太能理解它所带来的“进步”,但是,将它与后端c++、java类比,我感觉,组件就像是这些语言中的类和对象的概念,通过封装好的组件(类),可以通过挂载的方式,非常方便的调用其提供的功能,而不必重新写一遍实现逻辑。 我们常用的element UI就是由饿了么所提供的组件库,但是在项目开发中,我们可能还需要额外地定义一

ConstraintLayout布局里的一个属性app:layout_constraintDimensionRatio

ConstraintLayout 这是一个约束布局,可以尽可能的减少布局的嵌套。有一个属性特别好用,可以用来动态限制宽或者高app:layout_constraintDimensionRatio 关于app:layout_constraintDimensionRatio参数 app:layout_constraintDimensionRatio=“h,1:1” 表示高度height是动态变化

App Store最低版本要求汇总

1,自此日期起: 2024 年 4 月 29 日 自 2024 年 4 月 29 日起,上传到 App Store Connect 的 App 必须是使用 Xcode 15 为 iOS 17、iPadOS 17、Apple tvOS 17 或 watchOS 10 构建的 App。将 iOS App 提交至 App Store - Apple Developer 2,最低XCode版本 Xcod

SpringMVC的第一个案例 Helloword 步骤

第一步:web.xml配置 <?xml version="1.0" encoding="UTF-8"?> <web-app version="2.5" xmlns="http://java.sun.com/xml/ns/javaee" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocati