Unity入门3D物体
Posted Lampard猿奋
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Unity入门3D物体相关的知识,希望对你有一定的参考价值。
【Unity入门】3D物体
大家好,我是Lampard~~
欢迎来到Unity入门系列博客,所学知识来自B站阿发老师~感谢
(一)物体移动旋转缩放
(1)物体移动
在上一篇文章【Unity入门】场景视图操作我们学会了在场景中创建3D物体,学会了对场景视图进行调整。今天我们主要是学会对3D物体进行操作,以及分析3D物体的组成,废话不多说,首先是物体在场景中的移动:
打开我们创建的项目,创建一个Cube立方体。选中它,我们就会看到立方体冒出了红绿蓝代表着xyz的指向箭头,我们选中其中一个箭头,就可以让立方体在这个轴的方向上进行移动
放大视图,我们还可以看到这个立方体内部有红绿蓝色的三个面,选中它拖动,可以让立方体在xy,yz,xz这三个面的方向移动
当然这样子拖动可能不会很精确,如果需要移动到确定的某一个位置,那么我们可以在右方组件列表中对其Transfrom的Position属性进行设置
(2)物体旋转
左上角在Hierarchy层级管理器上方,还有一排小菜单。我们发现之前我们对场景的操作都是默认使用Move Tool,隔壁还有Rotate Tool,Scale Tool等。我们现在测试物体旋转,是需要切换至Rotate Tool的
切换后,会出现红绿蓝三个圆,分别对应xyz轴的旋转,拖动它就可以调整物体的旋转角度了
和移动相同,若想精确设定旋转值,我们需要对Transfrom的Rotation属性进行设置
(3)物体缩放
和旋转一样,我们首先切换至Scale Tool模式,然后会看到红绿蓝三色的线段,拖动就可以控制物体在xyz方向的缩放,好玩的是,中间还有一个小立方体,如果按住它来拖动,是会对物体进行整体的缩放
和移动相同,若想精确设定缩放值,我们需要对Transfrom的Scale属性进行设置
(二)网格材质纹理
(1)网格
第一次接触3D物体的话,会觉得好神奇啊,这个物体究竟是由什么组成的呢?其实3D物体基本就是由网格,材质和纹理3个部分构成的(个人愚见)
那什么是网格?首先需要知道我们看到的3D物体,实际上是由一个个小的三角形组成的,我们可以在Unity编译器中,在Scene页签下方选择一种Shaded Wireframe图形线框模式,就可以很清晰的看到了
无论是球还是正方体,都是由一个个小三角形组成。那问题很多的同学可能会问(就是我),为什么是三角形呢?我立刻ChatGpt一下:
因为三角形可以在几何上更加精确地描述物体的形状和表面细节。此外,三角形也更容易处理和渲染,因为它们具有确定的顶点和法线。虽然四边形和其他多边形也可以用于建模,但在使用现代渲染技术时,三角形仍然是最常见的面形式
额,绕远了...好所以网格是什么呢?其实就是描述这些一个个三角形,顶点数据,纹理坐标,法线信息等等的一些数据。之前我们学openGL的时候有接触到【openGL2021版】obj格式文件
(2)材质
好了什么是材质呢?
物体的物质的性质、特征或组成。材质可以是金属、塑料、木材、玻璃、陶瓷、纺织品等等。正确选择材质可以决定物体的质量、外观、特性和使用寿命。材质也可以用于表示3D模型的外观和质感。在计算机图形学中,材质通常用纹理、颜色、反射率、粗糙度、透明度等参数来描述
简单来说,足球和保龄球长得不一样吧?虽然都是个球,但是我们要怎么表现它们的不同,那就是材质的作用
在Unity中,我们可以给物体新建一个材质挂上去:首先在Assert目录下右键选择create创建,然后在目录下选中Material材质
材质有很多属性,我们先对其Albedo反照率(颜色),进行设置选一个喜欢的颜色就可以。下面我就创造了一个红色和一个蓝色材质
那怎么让我们场景中的物体使用这个材质呢?很简单啊,直接拖过去就行:
哇,一下就变色了,是不是很神奇。设置完之后我们可以看到,物体右侧的组件中,Mesh Renderer 网格渲染中,就多了一个我们刚才创建的材质信息
这里有一个小对勾,如果我们取消勾选,那么这个物体就不会被渲染出来
(3)纹理
那纹理又是啥呢?因为我们现实生活中,物体很少会遇到纯色的。肯定每一个物体,甚至物体的每一个地方都有区别
那怎么实现这个效果呢?就需要美术同学出一张纹理图,来展示这个物体的长相。我们刚才说到网格中会存在纹理坐标,就是为了描述每个小三角形对应纹理的那一块区域用的
为了展示我去百度找了一个地球的纹理更直观些,看上去就像摊开的地球对吧~
那如果我想把这个纹理挂到unity上面的物体中需要怎么做呢?我们只需要把纹理资源拖到Assert目录下
然后在材质设置反照率的左侧有一个小按钮,点开就可以选中我们的纹理,给物体添加皮肤啦~
不知不觉2点了,好啦今天就到这里,感谢阅读!!!
点赞,关注!!!
Unity3D 入门小技巧——鼠标拾取并移动物体
http://blog.csdn.net/sysujackjiao/article/details/69396274
一、鼠标拾取物体的原理
在Unity3D当中,想要在观察面(Aspect)中拾取物体(有碰撞属性)的方法一般如下:
1、声明一个观察的摄像机、一个从摄像机原点出发的射线Ray以及一个用于检测碰撞的RaycastHit;
2、将射线Ray定义为从摄像机原点出发并且指向当前鼠标所在的坐标(屏幕坐标);
3、定义碰撞RaycastHit为射线Ray与有碰撞属性的物体的碰撞点。
具体代码实现如下(C#代码):
- <span style="font-size:10px;">using System.Collections;
- using System.Collections.Generic;
- using UnityEngine;
- public class camera : MonoBehaviour
- {
- public Camera ca;
- private Ray ra;
- private RaycastHit hit;
- // Use this for initialization
- void Start()
- {
- }
- // Update is called once per frame
- void Update()
- {
- ra = ca.ScreenPointToRay(Input.mousePosition);
- if (Physics.Raycast(ra, out hit))
- {
- }
- }
- }</span>
应用一:当鼠标按住不动时,移动被选定物体随鼠标一起移动
- <span style="font-size:10px;">using System.Collections;
- using System.Collections.Generic;
- using UnityEngine;
- public class camera : MonoBehaviour
- {
- public Camera ca;
- private Ray ra;
- private RaycastHit hit;
- // Use this for initialization
- void Start()
- {
- }
- // Update is called once per frame
- void Update()
- {
- if (Input.GetMouseButton(0))
- {
- ra = ca.ScreenPointToRay(Input.mousePosition);
- if (Physics.Raycast(ra, out hit))
- {
- hit.collider.gameObject.transform.position = ca.ScreenToWorldPoint(new Vector3(Input.mousePosition.x, Input.mousePosition.y, hit.collider.gameObject.transform.position.z));
- }
- }
- }
- }</span>
应用二:当鼠标点击物体时,物体随鼠标一起移动;当鼠标再次点击时,放下物体。
- <span style="font-size:12px;">using System.Collections;
- using System.Collections.Generic;
- using UnityEngine;
- public class camera : MonoBehaviour {
- public Camera ca;
- private Ray ra;
- private RaycastHit hit;
- private int flag = 0;
- // Use this for initialization
- void Start () {
- }
- // Update is called once per frame
- void Update () {
- if (Input.GetMouseButtonDown(0))
- {
- ra = ca.ScreenPointToRay(Input.mousePosition);
- if (Physics.Raycast(ra, out hit))
- {
- if (flag == 0)
- {
- flag = 1;
- } else
- {
- flag = 0;
- }
- }
- }
- if (flag == 1)
- {
- hit.collider.gameObject.transform.position = ca.ScreenToWorldPoint(new Vector3(Input.mousePosition.x, Input.mousePosition.y, hit.collider.gameObject.transform.position.z));
- }
- }
- }
- </span>
Unity3D鼠标坐标转世界坐标和局部坐标
鼠标坐标转世界坐标和局部坐标:
Vector3 MousePosition2Local () {
mousePosition = Input.mousePosition; //获取屏幕坐标
mouseWorldPos = Camera.main.ScreenToWorldPoint (mousePosition); //屏幕坐标转世界坐标
mouseLocalPos = transform.parent.transform.InverseTransformPoint (mouseWorldPos); //世界坐标转本地坐标
return CorrectPos(mouseLocalPos);
}
以上是关于Unity入门3D物体的主要内容,如果未能解决你的问题,请参考以下文章