在被各种自定义view折磨之后。公司又来了新需求,之前实在是太忙,本来想着过段时间闲下来,将我之前写的无数个自定义view,挑几个有价值的,跟大家分享一下。谁想到,一重山是一重关啊,又来了一个3D模型的需求。刚开始想过从网上找3D模型的解析库。我们要解析的是obj dae fbx。但是找来找去,没有找到一个好的,或多或少都有些问题。后来经过一番折磨之后,选择了unity3D。我想着也可能是真正的大神不会总是分享自己的经验?所以android的3D模型才会发展的这么慢?不得而知。
好吧,进入正题吧。
首先我要实现的是显示模型,这个很简单了。需要将dae,obj或者fbx文件拖动到assets文件夹下面,然后呢将文件拖动到上面的主页上面。
拖到这里然后我们可以看到上面有一个Main Camera和Directional Light,一个是主摄像机,另外一个是环境光。
然后下面的是我的模型,在还没有完全绘制完的模型就已经500M了,很难想象真正画完是有多大.
然后我们只需要将摄像机对准我们的模型,然后我们就可以去游戏视图中看到我们的模型。虽然我们在预览的页面可以上下左右的控制模型的旋转缩放和扩大,但是真正运行到手机上,却不能旋转缩放了 ,我一直以为运行到手机上能和预览效果一样呢。谁知道....
然后我就开始了爬坑操作。
从网上疯狂搜索关于unity3D模型的手势操作的代码,然后一遍又一遍的往里面粘贴,但是根本没有用。后来中潜下心来,用心摸索。终于实现了自己想要的结果,当然也有一部分代码是借鉴前贤手札,照葫芦画瓢的。
真是正题了
1.编写主摄像机的脚本
首先点击主摄像机,找到 Add Component 并且点击。然后找到new script,新建一个脚本。
然后在里面声明一个公共变量
public Transform engTransform;
这个东西其实是我们一会要关联我们要查看的模型的关键字段。我们声明完这个字段之后执行保存操作,然后去看unity3D的面板,会多一个这个画面。
关联然后我们可以将模型拖动到这个transform中,之后我们继续编写摄像机的脚本。
private Vector3 offset;
声明偏移量;
然后在start()方法中,让我们摄像机的transform对准我们模型的坐标位置。正对着。
然后计算摄像机和模型的初始偏移量,也就是距离。
transform.LookAt(engTransform.position);
offset = transform.position - engTransform.position;
然后在update()方法中,
我们只需要用模型的位置坐标+偏移量 就得到了改变之后的摄像机的位置。
void Update () {
transform.position = offset + engTransform.position;
}
亏我踩了那么多坑,真相却如此赤裸裸。可能是真正的unity3D大神都已经不屑写这个东西了。所以在网上找的大多都有问题。
然后贴出模型的脚本文件。这里面有个问题需要澄清一下。
public class tyreTouch : MonoBehaviour
{
private Touch oldTouch1;
private Touch oldTouch2;
private GameObject engGameObject;
// Use this for initialization
void Start()
{
engGameObject = GameObject.Find("engine");
}
// Update is called once per frame
void Update()
{
//没有触摸
if (Input.touchCount <= 0)
{
return;
}
if (Input.touchCount == 1)
{
Touch touch = Input.GetTouch(0);
Vector2 deltaPos = touch.deltaPosition;
engGameObject.transform.Rotate(Vector3.down * deltaPos.x, Space.World);
engGameObject.transform.Rotate(-Vector3.right * deltaPos.y, Space.World);
}
Touch newTouch1 = Input.GetTouch(0);
Touch newTouch2 = Input.GetTouch(1);
if (newTouch2.phase == TouchPhase.Began)
{
oldTouch2 = newTouch2;
oldTouch1 = newTouch1;
return;
}
float oldDistance = Vector2.Distance(oldTouch1.position, oldTouch2.position);
float newDistance = Vector2.Distance(newTouch1.position, newTouch2.position);
float offest = newDistance - oldDistance;
float scaleFactor = offest / 1000f;
Vector3 localScale = transform.localScale;
Vector3 scale = new Vector3(localScale.x + scaleFactor, localScale.y + scaleFactor, +localScale.z + scaleFactor);
if (scale.x > 0.3f && scale.y > 0.3f && scale.z > 0.3f)
{
engGameObject.transform.localScale = scale;
}
oldTouch1 = newTouch1;
oldTouch2 = newTouch2;
}
}
这是从网上粘过来的代码,我只改动了标黑的两处。
第一处是我们自己的模型,要替换为项目中我们自己模型的名字。
然后第二处,是我运行网上代码,发现的问题,我发现手势操作左右滑动时的方向是正确的,但是当我上下滑动时,方向却是相反的。所以我就将这个向量变成了负数,相应的y轴滑动方向也就是人类的习惯了。不再反人类。
o了,就到这,继续去学习unity3D,
有什么问题 大家随时交流!
网友评论