和平精英3d建模夜景 (和平精英3d建模制作完整版)

和平精英建模效果设计,和平精英建模渲染

引言

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

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

本文将介绍一下在 Cocos 游戏开发中实现 和平精英 3D模型渲染到2D界面 的模型展示效果。

本期知识点

1.RenderTexture

渲染贴图CameraCanvas 组件的渲染目标对象,渲染管线会使用它的 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打开项目即可

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

和平精英建模效果设计,和平精英建模渲染

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

和平精英建模效果设计,和平精英建模渲染

3.编写代码

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

  • modelUrl,模型的路径,直接通过resources.load加载。
  • modelOffsetY,模型的偏移,用于调整模型显示的位置。
  • orthoHeight,相机的正交视角高度,用于调整模型的大小。
  • modelSprite,目标精灵。
export class ModelRtt extends Component {
    @property(CCString)
    modelUrl: string = "";
    @property(CCFloat)
    modelOffsetY: number = 0;
    @property(CCFloat)
    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 ,大小建议5121024或者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, () => { flag = true; }, this);
this.node.on(NodeEventType.TOUCH_END, () => { 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; //设置目标RenderTexture
camera.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