实现和平精英中3D模型渲染到2D界面的模型展示效果 - 火星时代教育

发布时间:2024-05-16 12:36:23 浏览量:186次

引言

3D模型渲染到2D界面的模型展示效果

在游戏开发中常常需要在UI界面上显示一个3D模型,例如时装界面里人物换装展示、Boss挑战界面里选择Boss展示等等。

本文将介绍一下在Cocos游戏开发中实现"火星时代教育"中3D模型渲染到2D界面的模型展示效果。

本期知识点

1. RenderTexture

渲染贴图是Camera或Canvas组件的渲染目标对象,渲染管线会使用它的RenderWindow作为渲染的目标窗口。

我们可以把相机画面渲染到它上面,然后将精灵Sprite的贴图资源设置成它。

2. Camera

渲染场景中的相机对象,由项目层的Camera管理。

我们可以通过它的targetTexture指定此相机的渲染输出目标贴图,默认为屏幕。

3. SpriteFrame

精灵帧资源。

我们通过SpriteFrame的texture设置贴图对象资源,可以是TextureBase类型。

3D模型渲染到2D界面实例

接下来我们来实现"火星时代教育"中3D模型渲染到2D界面的模型展示效果。

1. 环境

引擎版本:Cocos Creator 3.8.1

编程语言:TypeScript

2. 资源准备

创建一个新工程,笔者用3.8.2体验,大家用3.8.1打开项目即可。

按照下面结构拼一下UI。cocos是背景图,ModelSprite是渲染到的目标精灵,Camera是拍模型的摄像机。

然后把商城上的鸡带走并做成预制体借用一下。

3. 编写代码

新建一个ModelRtt组件,并且拖到ModelSprite上。其中包含几个属性。

  • modelUrl, 模型的路径,直接通过resources.load加载。
  • modelOffsetY, 模型的偏移,用于调整模型显示的位置。
  • orthoHeight, 相机的正交视角高度,用于调整模型的大小。
  • modelSprite, 目标精灵。
export class ModelRtt extends Component {    @property(CCString)    modelUrl: string = "";    @property(CFloat)    modelOffsetY: number = 0;    @property(CFloat)    orthoHeight: number = 0;    modelSprite: Sprite = null;}

然后编写loadPrefab方法通过resources.load加载模型。

loadPrefab() {    if (!this.modelUrl || !this.modelSprite) {        error('Please provide a valid prefab path and target sprite.');        return;    }    resources.load(this.modelUrl, Prefab, (err, prefab) => {        if (err) {            error('Failed to load the prefab:', err);            return;        }        this.createModel(prefab);    });}

最后通过以下步骤完成3D模型渲染到2D界面。

  • 创建RenderTexture,大小建议512、1024或者2048。
const size = this.node.getComponent(UITransform).contentSize;const modelRtt = new RenderTexture();modelRtt.reset({    width: size.width,    height: size.height});
  • 创建模型,并且设置偏移。
const newNode = new Node();newNode.parent = find("/");const modelNode: Node = instantiate(prefab);modelNode.parent = newNode;modelNode.setPosition(new Vec3(0, this.modelOffsetY, 0));
  • 进行拖拽事件的监听和实现模型转动。
let flag = false;this.node.on(NodeEventType.TOUCH_START, (event: EventTouch) => { flag = true; }, this);this.node.on(NodeEventType.TOUCH_END, (event: EventTouch) => { flag = true; }, this);this.node.on(NodeEventType.TOUCH_MOVE, (event: EventTouch) => {    if (flag) {        modelNode.eulerAngles = new Vec3(0, modelNode.eulerAngles.y + event.getDeltaX(), 0);    }}, this);
  • 获取我们在场景中创建的摄像机,并且设置一些相关参数。(这里面用动态添加的Camera不会动态渲染,暂时不做研究)。
// const camera = new Node("Camera").addComponent(Camera); //todo:动态添加的Camera模型不会动 const camera = this.node.getComponentInChildren(Camera);camera.clearFlags = Camera.ClearFlag.SOLID_COLOR; //设置缓冲清楚标志位camera.projection = renderer.scene.CameraProjection.ORTHO; //设置相机投影类型camera.orthoHeight = this.orthoHeight; //设置正交视角高度camera.clearColor = new Color(0, 0, 0, 0); //设置透明camera.targetTexture = modelRtt; //设置目标RenderTexturecamera.node.parent = newNode;camera.node.position = new Vec3(0, 0, 10);
  • 设置目标精灵的精灵帧。
const spriteFrame = new SpriteFrame();spriteFrame.texture = modelRtt;spriteFrame.flipUVY = true;this.modelSprite.spriteFrame = spriteFrame;

4. 效果演示



【100个Cocos实例】实现和平精英中3D模型渲染到2D界面的模型展示效果
原文链接:
https://juejin.cn/post/7311603519601147945

热门课程推荐

热门资讯

请绑定手机号

x

同学您好!

您已成功报名0元试学活动,老师会在第一时间与您取得联系,请保持电话畅通!
确定