【小沐学Unity3d】Unity3d导入3D模型

news2024/11/25 23:29:01

文章目录

  • 1、简介
    • 1.1 标准文件格式
    • 1.2 专有文件格式
    • 1.3 从 Autodesk® 3ds Max® 导入对象
    • 1.4 从 Blender 导入对象
  • 2、测试
    • 2.1 新建项目
    • 2.2 导入fbx
    • 2.2 手动调整相机
    • 2.3 脚本控制相机
  • 结语

在这里插入图片描述

1、简介

Unity 支持多种标准和专有模型文件格式。
Unity 内部使用 .fbx 文件格式作为其导入链。最佳做法尽可能使用 .fbx 文件格式,并且不应在生产中使用专有文件格式。
在这里插入图片描述

1.1 标准文件格式

Unity 可读取以下标准 3D 文件格式:

  • .fbx
  • .dae (Collada)
  • .dxf
  • .obj.

1.2 专有文件格式

您不应在生产中使用这些文件格式,应尽可能导出为 .fbx 文件格式。但是,有时您可能需要将这些文件作为项目的一部分包含在内。

Unity 可以从以下 3D 建模软件中导入专有文件,然后将其转换为 .fbx 文件:

  • Autodesk Maya
  • Blender
  • Modo
  • Cheetah3D

以下应用程序不使用 .fbx 作为中间格式。Unity 必须先将其转换为 .fbx 文件之后再导入编辑器:

  • SketchUp
  • SpeedTree
  • Autodesk® 3ds Max®

1.3 从 Autodesk® 3ds Max® 导入对象

Unity 通过 FBX 格式导入 Autodesk® 3ds Max® 文件 (.max),支持以下内容:

  • 所有节点以及位置、旋转和缩放;轴心点和名称也会导入
  • 网格以及顶点颜色、法线和一个或多个 UV 集
  • 材质以及漫射纹理和颜色。每个网格多种材质
  • 动画
  • 基于骨骼的动画
  • 变形目标(混合形状)
  • 可见性
    在这里插入图片描述

1.4 从 Blender 导入对象

Unity 通过 FBX 格式导入 Blender (.blend) 文件,支持以下内容:

  • 所有节点以及位置、旋转和缩放;轴心点和名称也会导入
  • 网格以及顶点、多边形、三角形、UV 和法线
  • 骨骼
  • 蒙皮网格
  • 动画
    在这里插入图片描述

2、测试

2.1 新建项目

在这里插入图片描述
进入u3d的项目的场景显示:
在这里插入图片描述

2.2 导入fbx

导入模型资源到u3d里。
在这里插入图片描述
将外面文件夹的模型文件拖拽到assets的根目录里面,如下:
在这里插入图片描述
将assets里的duck模型拖拽到u3d左侧的层次树上。
在这里插入图片描述
此时在中间的三维场景中出现了一只小黄鸭。
在这里插入图片描述
此时是编辑界面,在编辑界面观察模型的鼠标操作如下:
(1) 旋转:按住鼠标右键移动
(2) 平移:按住鼠标中键移动
(3) 缩放:滚动鼠标中键

2.2 手动调整相机

编辑状态下:
在这里插入图片描述
鼠标双击左边的层级树上的主相机对象节点后:
在这里插入图片描述
我们把主相机的位置移动,让它离鸭子近一点。
在这里插入图片描述
点击运行按钮之后:
在这里插入图片描述
比较主相机的画面和运行后的画面,会发现我们看到的鸭子的角度和距离不同,肯定是相机不同。但是我们没有修改相机呀,为啥呢?

原来模型自带了一个固定相机。无论场景的主相机怎么变化,场景运行状态下的视角都不变。

资源界面可以看见这个模型自带相机对象:
在这里插入图片描述
对象层级树上也可以看见这个相机对象:
在这里插入图片描述
我们尝试删掉鸭子模型自带的相机,
在这里插入图片描述
或者取消鸭子自带相机的选择。都可以。
在这里插入图片描述
然后点击运行按钮。
在这里插入图片描述
现在和主相机的画面一样了。
在这里插入图片描述

2.3 脚本控制相机

现在我们回顾上面的内容:
(1)新建项目。
(2)导入模型资源到u3d里。
(3)将外面文件夹的模型文件拖拽到assets的根目录里面
(4)将assets里的duck模型拖拽到u3d左侧的层次树上。
(5)删除鸭子自带的相机对象。

现在我们开始脚本控制相机的相关学习。小沐同学加油。
鼠标左键点击层次树上的主相机节点。
在这里插入图片描述
右边的属性窗口出现主相机的相关参数。
在这里插入图片描述
鼠标点击Add Component按钮,出现下拉框,在里面找到New Script。
鼠标再点击New Script, 出现脚本新建的界面。
添加一个脚本对象名字:MouseOperationCameraRotationFovMove
然后点击下面的按钮“Create And Add”
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
然后属性框上出现了一个脚本组件。Asset资源框也出现了一个脚本文件。
在这里插入图片描述
鼠标双击脚本文件,弹出visual studio的代码编辑界面。
在这里插入图片描述
visual studio的代码编辑界面,会自动生成一部分默认代码,如下:
在这里插入图片描述
将任务文件夹内的相同脚本文件的内容复制进去。
在这里插入图片描述
代码如下:

using System.Collections;
using System.Collections.Generic;
using UnityEngine;
 
public class MouseOperationCameraRotationFovMove : MonoBehaviour
{
    public enum MouseState { 
        None,
        MidMouseBtn,
        LeftMouseBtn
    }
    private MouseState mMouseState = MouseState.None;
    private Camera mCamera;
 
    private void Awake()
    {
        mCamera = GetComponent<Camera>();
        if (mCamera==null)
        {
            Debug.LogError(GetType()+"camera Get Error ……");
        }
 
        GetDefaultFov();
    }
 
    private void LateUpdate()
    {
        CameraRotate();
        CameraFOV();
        CameraMove();
    }
 
    //旋转最大角度
    public int yRotationMinLimit = -20;
    public int yRotationMaxLimit = 80;
    //旋转速度
    public float xRotationSpeed = 250.0f;
    public float yRotationSpeed = 120.0f;
    //旋转角度
    private float xRotation = 0.0f;
    private float yRotation = 0.0f;
 
    /// <summary>
    /// 鼠标移动进行旋转
    /// </summary>
    void CameraRotate()
    {
        if (mMouseState == MouseState.None)
        {
           
            //Input.GetAxis("MouseX")获取鼠标移动的X轴的距离
            xRotation -= Input.GetAxis("Mouse X") * xRotationSpeed * 0.02f;
            yRotation += Input.GetAxis("Mouse Y") * yRotationSpeed * 0.02f;
 
            yRotation = ClampValue(yRotation, yRotationMinLimit, yRotationMaxLimit);//这个函数在结尾
                                                    //欧拉角转化为四元数
            Quaternion rotation = Quaternion.Euler(-yRotation, -xRotation, 0);
            transform.rotation = rotation;
 
        }
    }
 
    //fov 最大最小角度
    public int fovMinLimit = 25;
    public int fovMaxLimit = 75;
    //fov 变化速度
    public float fovSpeed = 50.0f;
    //fov 角度
    private float fov = 0.0f;
 
    void GetDefaultFov() {
        fov = mCamera.fieldOfView;
    }
 
    /// <summary>
    /// 滚轮控制相机视角缩放
    /// </summary>
    public void CameraFOV()
    {
        //获取鼠标滚轮的滑动量
        fov += Input.GetAxis("Mouse ScrollWheel") * Time.deltaTime * 100 * fovSpeed;
 
        // fov 限制修正
        fov = ClampValue(fov,fovMinLimit, fovMaxLimit);
 
        //改变相机的 fov
        mCamera.fieldOfView = (fov);
    }
 
    float _mouseX = 0;
    float _mouseY = 0;
    public float moveSpeed = 1;
    /// <summary>
    /// 中键控制拖动
    /// </summary>
    public void CameraMove()
    {
        if (Input.GetMouseButton(2))
        {
            _mouseX = Input.GetAxis("Mouse X");
            _mouseY = Input.GetAxis("Mouse Y");
 
            //相机位置的偏移量(Vector3类型,实现原理是:向量的加法)
            Vector3 moveDir = (_mouseX * - transform.right + _mouseY * - transform.forward);
 
            //限制y轴的偏移量
            moveDir.y = 0;
            transform.position += moveDir * 0.5f * moveSpeed;
        }
        else if (Input.GetMouseButtonDown(2))
        {
            mMouseState = MouseState.MidMouseBtn;
            Debug.Log(GetType() + "mMouseState = " + mMouseState.ToString());
        }
        else if (Input.GetMouseButtonUp(2))
        {
            mMouseState = MouseState.None;
            Debug.Log(GetType() + "mMouseState = " + mMouseState.ToString()); 
        }
    }
    //值范围值限定
    float ClampValue(float value, float min, float max)//控制旋转的角度
    {
        if (value < -360)
            value += 360;
        if (value > 360)
            value -= 360;
        return Mathf.Clamp(value, min, max);
    }
}

然后切换到unity3d界面,u3d自动编译刚才的脚本。
鼠标点击unity最上面的运行按钮。
在这里插入图片描述
此时会发现鼠标可以控制相机变化,观察鸭子的不同角度了。
小沐同学的任务学习结束。

结语

如果您觉得该方法或代码有一点点用处,可以给作者点个赞,或打赏杯咖啡;╮( ̄▽ ̄)╭
如果您感觉方法或代码不咋地//(ㄒoㄒ)//,就在评论处留言,作者继续改进;o_O???
如果您需要相关功能的代码定制化开发,可以留言私信作者;(✿◡‿◡)
感谢各位大佬童鞋们的支持!( ´ ▽´ )ノ ( ´ ▽´)っ!!!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/629970.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

【前端 - CSS】第 9 课 - CSS 初体验

欢迎来到博主 Apeiron 的博客&#xff0c;祝您旅程愉快 &#xff01; 时止则止&#xff0c;时行则行。动静不失其时&#xff0c;其道光明。 目录 1、CSS 定义 2、基础选择器 3、文字控制属性 4、示例代码 5、总结 1、CSS 定义 层叠样式表&#xff08;Cascading Style …

IP组播6_PIM-SM(SSM)详解

目录 1.PIM-SM&#xff08;SSM&#xff09;简介 2.PIM-SM&#xff08;ASM&#xff09;工作原理 3.PIM-SM&#xff08;SSM&#xff09;实验 3.1 PIM-SM&#xff08;SSM&#xff09;常用配置命令 3.2 PIM-SM&#xff08;ASM&#xff09;实验配置步骤 3.3 PIM-SM&#xff08…

HTMLCSS Day01 功能元素与HTTP请求协议详解

文章目录 1.功能元素1.1.列表标签- HTML中列表标签的分类 1.1.1.无序列表:- 无序列表格式:- 无序列表样式- 注意点:- 无序列表应用场景: 1.1.2.有序列表- 有序列表格式:- 有序列表样式 1.1.3.定义列表- 定义列表的格式:- 定义列表的应用场景- 定义列表的注意点 1.2.表格标签- 什…

【算法】手写题

文章目录 画一个三角形实现三栏布局通过position和margin通过float和margin通过flex实现 变量提升题实现边框0.5px深拷贝快速排序手写发布订阅/事件总线 画一个三角形 .box1 {width: 0;height: 0;border: 10px solid;border-color: red transparent transparent transparent;}实…

window编写redis服务启动脚本

日常工作中&#xff0c;每次启动项目总会忘记开启redis服务&#xff0c;并收货一天中的第一个项目报错&#xff0c;然后经历繁琐的文件查找redis所在目录&#xff0c;并点击redis-server.exe&#xff0c;启动服务&#xff0c;于是笔者在想&#xff0c;如果在桌面写个脚本一键启…

新项目,不妨采用这种架构分层,很优雅

在专栏开篇提到过DDD&#xff08;Domain-Driven Design&#xff0c;领域驱动设计&#xff09;学习起来较为复杂&#xff0c;一方面因为其自身涉及的概念颇多&#xff0c;另一方面&#xff0c;我们往往缺乏实战经验和明确的代码模型指导。今天&#xff0c;我们将专注于DDD的分层…

机器学习笔记 - EANet 外部注意论文简读及代码实现

一、论文简述 论文作者提出了一种新的轻量级注意力机制&#xff0c;称之为外部注意力。如图所示&#xff0c;计算自注意力需要首先通过计算自查询向量和自关键字向量之间的仿射关系来计算注意力图&#xff0c;然后通过用该注意力图加权自值向量来生成新的特征图。外部关注的作用…

条款29:假定移动操作不存在、成本高、未使用

移动语义可以说在C11的所有语言特性中占据着首要中的首要地位。“移动容器现在和复制指针一样成本低廉了&#xff01;”这是你很可能听说过的&#xff0c;类似说法还有“复制临时对象现在已经如此高效&#xff0c;如果刻意在撰写代码总避免它&#xff0c;就无异于犯了过早优化的…

java SSM 程序在线评判系统myeclipse开发mysql数据库springMVC模式java编程计算机网页设计

一、源码特点 java SSM 程序在线评判系统是一套完善的web设计系统&#xff08;系统采用SSM框架进行设计开发&#xff0c;springspringMVCmybatis&#xff09;&#xff0c;对理解JSP java编程开发语言有帮助&#xff0c;系统具有完整的源代码和数据库&#xff0c;系统主要采…

PDCA循环

PDCA循环 由美国质量管理专家沃特阿曼德休哈特&#xff08;Walter A. Shewhart&#xff09;首先提出的&#xff0c;由戴明采纳、宣传&#xff0c;获得普及&#xff0c;所以又称戴明环。 模型介绍 戴明是一位美国的质量管理大师&#xff0c;却成名于日本。在他的帮助下&#xf…

JQuery 操作Class实现前段交互方案(推荐)

一、JQuery基础控制图片宽度实现动画交互 1.html页面声明周期 //页面生命周期 //页面的数据html&#xff0c;加载完成&#xff0c; 图片ajax视频 在异步加载中 //document.ready---DOMContentLoaded ----小程序onload ---Vue created() //页面加载完成 //window.onload…

二叉树的相关操作

一.二叉树 本文的数据结构基于C语言练习。 C语言中的二叉树是一种数据结构&#xff0c;用于表示具有层次关系的数据集合。它由一个根节点开始&#xff0c;每个节点最多有两个子节点&#xff0c;分别称为左子节点和右子节点。 二叉树有许多相关性质&#xff0c;其中一些重要的包…

记录一下idea黄色警戒线问题

记录一下idea黄色警戒线问题 一、通用文件中解决黄色波浪线问题1.选中File中的Settings进入2.点击Editor&#xff0c;选中Inspections&#xff0c;找到General&#xff0c;找到Dulicated code fragment点击取消 二、SQL文件中黄色警告线 一、通用文件中解决黄色波浪线问题 1.选…

jvm之7种垃圾回收器解读(下)

目录 G1回收器&#xff1a;区域化分代式 G1回收器的特点&#xff08;优势&#xff09; 空间整合 可预测的停顿时间模型&#xff08;即&#xff1a;软实时soft real-time&#xff09; G1垃圾收集器的缺点 G1回收器的参数设置 G1收集器的常见操作步骤 G1收集器的适用场景 分…

Spring SpringMVC Mybatis 整合 SSM整合 一篇就够了!

SSM详细整合教程 因为XML注解方式实现更加方便&#xff0c;所以我门选用它 文章目录 SSM详细整合教程一、整合思路二、整合步骤0. 前期准备引入Jar包与Web目录创建1. Spring框架编写1.1 创建Application配置文件 2. SpringMvc框架编写2.1 创建Springmvc-config文件2. 2 配置前端…

用栈模拟实现队列(c语言版)

前言 用"栈实现队列",力扣中一道oj题,可以帮助刚接触"栈"和"队列"的新手更好的理解栈和队列这两种结构. 题目来源于力扣: 题目链接:https://leetcode.cn/problems/implement-queue-using-stacks/ 难度:简单 目录 前言一、队列的各接口:1.1 类型…

机器学习实战六步法之数据收集方法(四)

要落地一个机器学习的项目&#xff0c;是有章可循的&#xff0c;通过这六个步骤&#xff0c;小白也能搞定机器学习。 看我闪电六连鞭&#xff01;&#x1f923; 数据收集 数据是机器学习的基础&#xff0c;没有数据一切都是空谈&#xff01;数据集的数据量和数据的质量往往决…

潮牌搭配APP的设计与实现

摘 要&#xff1a;本文开发过程以android为中心&#xff0c;通过数据库进行的数据访问操作。软件以面向对象的思维进行开发和设计&#xff0c;针对于广大群众进行下载使用&#xff0c;对用户提供了时尚的搭配&#xff0c;带领用户形成自己的一套搭配系统&#xff0c;做自己搭配…

C++ std::thread 与Qt qthread多线程混合编程

C与Qt深度融合&#xff1a;高效设计多线程应用框架 1. C与Qt线程的混合使用1.1 C线程与Qt线程的基本概念1.2 线程间的相互依赖关系1.3 设计合理的代码框架 二、深入理解C和Qt线程模型2.1 C线程模型2.2 Qt线程模型2.3 C和Qt线程模型的比较 三、C和Qt线程间的互操作性3.1 std::th…

Web应用技术(第十六周/END)

本次练习基于how2j的教程完成对SpringBoot的初步学习。 初识Springboot 学习导入&#xff1a;1.第一个基于SpringBoot的项目&#xff1a;&#xff08;1&#xff09;application.java&#xff1a;该文件中的核心代码&#xff1a; &#xff08;2&#xff09;HelloController.java…