跳至主要內容

渲染组件

yisky大约 5 分钟基础知识文档组件渲染组件

渲染组件用于数据渲染,它会依据不同的数据源显示相对应的渲染效果,例如,MeshRendererModelRenderer等。在 Fantasy 3D 中所有渲染组件都必须继承自 Renderer

渲染组件属性

提示

查询遮罩值(QueryMask)用于拾取查询过滤。

  • userData - 组件用户数据,读写属性。

  • position - 组件本地位置,读写属性。

  • scale - 组件本地缩放,读写属性。

  • rotation - 组件本地旋转量,读写属性。

  • quaternion - 组件本地旋转四元数,读写属性。

  • worldBounds - 组件世界外包范围,只读属性。

  • visible - 设置组件是否可见,只写属性。

  • renderOrder - 组件渲染顺序,读写属性。

提示

renderOrder 用于控制组件渲染顺序,值越小越靠前渲染,默认值为 Default

// 通过 RenderOrder 枚举设置
renderer.renderOrder = RenderOrder.Default + 1;

// 使用数值设置
renderer.renderOrder = 51;

渲染组件方法

import { Vector3 } from 'three';

const worldPosition = renderer.getWorldPosition( new Vector3() );
import { Vector3 } from 'three';

const worldScale = renderer.getWorldScale( new Vector3() );
import { Vector3 } from 'three';

const worldDirection = renderer.getWorldDirection( new Vector3() );
import { Quaternion } from 'three';

const worldQuaternion = renderer.getWorldQuaternion( new Quaternion() );
import { Euler, Vector3 } from 'three';

renderer.setTransformation( {

    position: new Vector3( 0.0, 0.0, 20.0 ),        // 本地位置
    scale: new Vector3( 2.0, 2.0, 2.0 ),            // 本地缩放
    rotation: new Euler( 0.0, Math.PI * 0.5, 0.0 )  // 本地旋转

} );
  • lookAt - 旋转组件使其朝向世界空间中的目标点。
import { Vector3 } from 'three';

renderer.lookAt( new Vector3( 0.0, 5.0, -3.0 ) );
  • localToWorld - 将组件本地空间中的坐标转换到世界空间中。
import { Vector3 } from 'three';

const local = new Vector3( 0.0, 5.0, 3.0 );
const world = renderer.localToWorld( local );
  • worldToLocal - 将组件世界空间中的坐标转换到本地空间中。
import { Vector3 } from 'three';

const world = new Vector3( 0.0, 5.0, 3.0 );
const local = renderer.worldToLocal( world );

提示

通常情况下我们不需要手动更新组件的世界矩阵,但当我们通过 three.js 原生 Object3D 对象更新方位属性时,更新后需要手动更新组件的世界矩阵。

// 获取组件 three.js 原生 Object3D 对象
const { object3D } = renderer;

// 通过原生 Object3D 对象更新方位信息
object3D.position.x += 10.0; // 沿X轴正向移动
object3D.rotation.y += 0.01; // 绕Y轴旋转

// 手动更新组件世界矩阵
renderer.updateWorldMatrix();
  • update - 帧更新接口,逐帧调用。

提示

Renderer 中的 update 是一个方法,子类需根据实际情况重载该方法。

提示

Renderer 中的 beforeCameraRender 是一个方法,子类需根据实际情况重载该方法。

提示

Renderer 中的 afterCameraRender 是一个方法,子类需根据实际情况重载该方法。

重要

Renderer 中的 raycast 是一个抽象方法,子类必须重载实现!

  • _destroy - 组件销毁接口,protected方法。

重要

  • Renderer 中的 _destroy 是一个抽象方法,子类必须重载实现!
  • _destroy 主要用于销毁渲染相关的Mesh、材质、纹理等资源。

渲染组件事件

  • on - 订阅事件。

  • once - 订阅事件且仅响应一次。

  • off - 取消事件订阅。

重要

“取消订阅”时如果不指定第二个参数,会取消该类型事件的所有订阅!

  • emit - 分发事件。

扩展渲染组件

Fantasy 3D允许开发人员扩展渲染组件以丰富实体渲染效果。在扩展渲染组件时需要注意以下几点:

// 赋值
this._object3D = new Mesh( geometry, material );

// 挂接
this._object3D = new Group();
this._object3D.add( new Mesh( geometry, material ) );
  • 需要将 Renderer 的 _renderOrder 赋值给渲染对象。
// 新建Mesh
const mesh = new Mesh( geometry, material );

// 设置RenderOrder
mesh.renderOrder = this._renderOrder;

// 赋值
this._object3D = mesh;

提示

渲染组件完整扩展示例:

import { BoxGeometry, Intersection, Mesh, MeshLambertMaterial, Raycaster } from 'three';
import { Entity, Renderer, defined } from '@fantasy3d/core';

class CubeRenderer extends Renderer {

 constructor( entity: Entity, parameters: any = {} ) {

   super( entity, parameters );

   // 初始化组件
   this._initialize( parameters );

 }

 // public functions

 /**
  * 射线查询(必须重载)
  */ 
 raycast( raycaster: Raycaster ): Intersection {

   const { _object3D: object3D } = this;

   if ( !defined( object3D ) || !object3D.visible ) {

     return null;

   }

   const intersections = [];

   object3D.raycast( raycaster, intersections );

   if ( intersections.length > 0 ) {

     intersections.sort( ( a, b ) => {

       return a.distance - b.distance;

     } );

     return intersections[ 0 ];

   }

   return null;

 }

 // private functions

 /**
  * 初始化接口
  */ 
 private _initialize( parameters: any ): void {

   const { size = 1.0, color = '#ff0000' } = parameters;

   // 创建Geometry
   const geometry = new BoxGeometry( size, size, size );

   // 创建材质
   const material = new MeshLambertMaterial( { color } );

   // 创建Mesh并赋值给"_object3D"
   this._object3D = new Mesh( geometry, material );

   // 设置RenderOrder
   this._object3D.renderOrder = this._renderOrder;

 }

 // protected functions

 /**
  * 销毁接口(必须重载)
  */ 
 protected _destroy(): void {

   const { _object3D: object3D } = this;
   const { geometry, material } = object3D as Mesh;

   // 释放Geometry资源
   geometry.dispose();

   // 释放Material资源
   material.dispose();

 }

}
上次编辑于: