diff --git a/README.en.md b/README.en.md index e6269137c0f679742455b1251326b0eb143b22e1..154edd483f0f53206f1e5098e98377b32862d033 100644 --- a/README.en.md +++ b/README.en.md @@ -11,9 +11,9 @@ Images rendered by the 3D engine are displayed in the **Component3D** component. | ------------------------------ | ----------------------------------- | ------------------------------ | -------------------------------- | | ![](screenshots/main_page.jpg) | ![](screenshots/node_container.jpg) | ![](screenshots/node_base.jpg) | ![](screenshots/node_camera.jpg) | -| node_light | scene_environment | scene_animation | scene_shader | -| ------------------------------- | -------------------------------------- | ------------------------------------ | --------------------------------- | -| ![](screenshots/node_light.jpg) | ![](screenshots/scene_environment.jpg) | ![](screenshots/scene_animation.jpg) | ![](screenshots/scene_shader.jpg) | +| node_light | scene_environment | scene_animation | scene_shader | +| ------------------------------- | -------------------------------------- | ------------------------------------------------------- | --------------------------------- | +| ![](screenshots/node_light.jpg) | ![](screenshots/scene_environment.jpg) | | ![](screenshots/scene_shader.jpg) | ### How to Use @@ -130,3 +130,5 @@ N/A 3. The DevEco Studio version must be DevEco Studio 5.0.4 Release or later. 4. The HarmonyOS SDK version must be HarmonyOS 5.0.4 Release SDK or later. + + diff --git a/README.md b/README.md index 8bfae06ee3f5141e6dc2c36690e8eb323851c81b..fbe844c770e0430bfa407e970ac046c19537d62c 100644 --- a/README.md +++ b/README.md @@ -7,13 +7,13 @@ ### 效果预览 -| 主页 | container | node_base | node_camera | -|-------------------------------------|------------------------------------------|-------------------------------------|----------------------------| +| 主页 | container | node_base | node_camera | +| ------------------------------ | ----------------------------------- | ------------------------------ | -------------------------------- | | ![](screenshots/main_page.jpg) | ![](screenshots/node_container.jpg) | ![](screenshots/node_base.jpg) | ![](screenshots/node_camera.jpg) | -| node_light | scene_environment | scene_animation | scene_shader | -|--------------------------------------|---------------------------------------------|-------------------------------------------|----------------------------------------| -| ![](screenshots/node_light.jpg) | ![](screenshots/scene_environment.jpg) | ![](screenshots/scene_animation.jpg) | ![](screenshots/scene_shader.jpg) | +| node_light | scene_environment | scene_animation | scene_shader | +| -------------------------------------------------- | --------------------------------------------------------- | ------------------------------------------------------- | ---------------------------------------------------- | +| | | | | 使用说明 @@ -53,20 +53,25 @@ ``` ### 具体实现 + * 添加、移除、遍历节点的功能接口参考:ContainerPage.ets - * 初始时会使用深度优先的方式遍历并打印场景中每一个节点的信息,从场景的root节点开始; - * 删除节点:调用remove方法删除指定节点,不会重复删除,在本示例中删除了头盔节点; - * 添加节点:调用append方法在子节点列表的末尾添加指定节点,不会重复添加,在本示例中添加了头盔节点; - * 添加节点:调用insertAfter方法在子节点列表的指定位置添加指定节点,不会重复添加,在本示例中添加了头盔节点; - * 清除子节点:调用clear方法清除子节点列表的所有节点,本示例中清除了root的子节点。 + + * 初始时会使用深度优先的方式遍历并打印场景中每一个节点的信息,从场景的root节点开始; + * 删除节点:调用remove方法删除指定节点,不会重复删除,在本示例中删除了头盔节点; + * 添加节点:调用append方法在子节点列表的末尾添加指定节点,不会重复添加,在本示例中添加了头盔节点; + * 添加节点:调用insertAfter方法在子节点列表的指定位置添加指定节点,不会重复添加,在本示例中添加了头盔节点; + * 清除子节点:调用clear方法清除子节点列表的所有节点,本示例中清除了root的子节点。 + * 对节点的基础属性如位置、旋转、大小等操作参考:NodeBase.ets - * 修改scale属性改变节点的大小,本示例中改变了头盔的大小; - * 修改position属性改变节点的位置,本示例中改变了头盔的x轴坐标; - * 修改rotation属性改变节点的旋转方向,改变子节点的父节点的rotation同样会改变子节点的旋转方向(position同理),本示例中改变了头盔的旋转方向; - * 修改节点的visible属性改变节点的可见性,本示例中改变了头盔的可见性; - * 使用getEnabled和setEnabled操作节点的layerMask,本示例中将layerMask的信息打印在界面上。 - + + * 修改scale属性改变节点的大小,本示例中改变了头盔的大小; + * 修改position属性改变节点的位置,本示例中改变了头盔的x轴坐标; + * 修改rotation属性改变节点的旋转方向,改变子节点的父节点的rotation同样会改变子节点的旋转方向(position同理),本示例中改变了头盔的旋转方向; + * 修改节点的visible属性改变节点的可见性,本示例中改变了头盔的可见性; + * 使用getEnabled和setEnabled操作节点的layerMask,本示例中将layerMask的信息打印在界面上。 + * 对相机的属性如投影、后处理等进行操作的功能接口参考:NodeCamera.ets + * 修改fov属性改变投影的视场角,本示例中设置了45/60/90三种; * 修改nearPlane和farPlane属性投影的近平面和远平面; * 修改enabled属性改变相机是否启用,设为false之后控件中的画面将不再刷新; @@ -75,6 +80,7 @@ * 修改clearColor属性可以设置每一帧的刷新背景色,设置a通道为零可以获得一个透明的背景,设置为null时不会刷新全部背景像素。 * 对灯光的类型、颜色、强度、阴影等进行操作的功能接口参考:NodeLight.ets + * lightType属性为只读,表示灯光的种类,目前有DIRECTIONAL和SPOT两种,分别为平行光和点光源; * 修改enabled属性改变灯光是否启用; * 修改color属性可以改变灯光的颜色,本示例中有三种可以变化; @@ -82,6 +88,7 @@ * 修改shadowEnabled属性可以设置灯光是否产生阴影。 * 对背景进行操作的功能接口考:SceneEnvironment.ets + * 同时修改backgroundType和environmentImage可以设置背景图片,backgroundType为BACKGROUND_IMAGE或BACKGROUND_EQUIRECTANGULAR时对应png或者jpeg格式的图片;类型为BACKGROUND_CUBEMAP时对应ktx格式的图片;类型为BACKGROUND_NONE时不设置背景图片,需要同时将camera的clearColor的a通道设置为0以获得透明背景; * 修改environmentMapFactor属性改变背景图的相应参数。 * 修改radianceImage属性改变PBR中的环境贴图; @@ -90,6 +97,7 @@ * 修改irradianceCoefficients属性改变PBR中的相应参数; * 对动画的播放、暂停等进行操作的功能接口参考:SceneAnimation.ets + * 修改enabled属性改变动画是否启用; * 只读属性duration、running、progress为动画的时长、进行状态、已经进行的比例; * 调用start方法控制动画开启; @@ -102,6 +110,7 @@ * onFinished方法在动画结束时执行传入的回调。 * 对纹理材质进行操作的功能接口参考:SceneShader.ets + * 首先创建一个shader作为ShaderMaterial的colorShader,再创建一个material作为纹理的ShaderMaterial; * 使用Geometry获取相应的带有Material的Mesh节点; * 修改shader的input参数; @@ -109,9 +118,11 @@ * 修改materialOverride属性,将纹理覆盖为自定义的ShaderMaterial。 ### 相关权限 + 不涉及 ### 约束与限制 + 1. 本示例仅支持标准系统上运行,支持设备:华为手机。 2. HarmonyOS系统:HarmonyOS 5.0.4 Release及以上。 @@ -121,6 +132,11 @@ 4. HarmonyOS SDK版本:HarmonyOS 5.0.4 Release SDK及以上。 5. 使用6.0.0及以上版本IDE构建此工程,会有以下告警,告警不影响程序运行及功能,可通过升级build-profile.json5中compatibleSdkVersion配置为"6.0.0(20)"的方式消除该告警。 - ``` + + ``` The 'createImage' API is supported since SDK version 20. However, the current compatible SDK version is 16. - ``` \ No newline at end of file + ``` + + + + diff --git a/entry/src/main/ets/graphics3d/SceneAnimation.ets b/entry/src/main/ets/graphics3d/SceneAnimation.ets index 8e48d98604047c392eabae8d035d36ea55d7f531..919907686a315dbaa23ca9e32944c5671120fd85 100644 --- a/entry/src/main/ets/graphics3d/SceneAnimation.ets +++ b/entry/src/main/ets/graphics3d/SceneAnimation.ets @@ -13,7 +13,7 @@ * limitations under the License. */ -import { Animation, Scene, Camera, EnvironmentBackgroundType } from '@kit.ArkGraphics3D'; +import { Animation, Scene, Camera, EnvironmentBackgroundType, SceneResourceFactory } from '@kit.ArkGraphics3D'; import { Animator, router, AnimatorResult } from '@kit.ArkUI'; import Logger from '../utils/Logger'; import { Constants } from '../constants/Constants'; @@ -31,6 +31,7 @@ struct SceneAnimation { scene: Scene | null = null; cam: Camera | null = null; backAnimator: AnimatorResult | undefined = undefined; + anim: Animation | null = null; onPageShow(): void { this.init(); @@ -57,15 +58,38 @@ struct SceneAnimation { } if (this.scene === null) { Scene.load($rawfile('gltf/BrainStem/glTF/BrainStem.gltf')) - .then(async (result: Scene) => { - this.scene = result; - this.sceneOpt = { scene: this.scene, modelType: ModelType.SURFACE } as SceneOptions; - let rf = this.scene.getResourceFactory(); - this.cam = await rf.createCamera({ 'name': 'Camera1' }); - this.cam.enabled = true; - this.cam.position.z = Constants.CAMERA_POSITION_Z_INDEX; - this.scene.environment.backgroundType = EnvironmentBackgroundType.BACKGROUND_NONE; - }) + .then(async (result: Scene) => { + this.scene = result; + let rf: SceneResourceFactory = this.scene.getResourceFactory(); + + // Get animation resources + this.anim = this.scene.animations[0]; + if (this.anim) { + this.anim.enabled = true; + // Register callback function + this.anim.onStarted(() => { + console.info('onStarted'); + this.animationCallbackInvoked = 'animation on start'; + }); + + this.anim.onFinished(() => { + console.info('onFinished'); + this.animationCallbackInvoked = 'animation on finish'; + }); + + Logger.info('ready to create a new animation.'); + } else { + Logger.error('No animation found in scene.'); + } + + // create a new camera. + this.cam = await rf.createCamera({ 'name': 'Camera' }); + // set the camera. + this.cam.enabled = true; + this.cam.position.z = 5; + + this.sceneOpt = { scene: this.scene, modelType: ModelType.SURFACE } as SceneOptions; + }) .catch((error: string) => { Logger.error(`init error: ${error}`); }); diff --git a/screenshots/scene_animation.jpg b/screenshots/scene_animation.jpg index 9cbe2f574306b4ac88ee7c3d24d8bb7ee6b25b16..be61e4fae4b75b3f4feee3d49e32813f8a158a2a 100644 Binary files a/screenshots/scene_animation.jpg and b/screenshots/scene_animation.jpg differ