[Unity3d]3D车展之汽车开门关门和旋转缩放的效果的实现

最近在一个3D汽车虚拟展示的项目,将其中的汽车开门关门的脚本简单的介绍一下吧,主要的原理就是通过从摄像机发射一个到屏幕点击的位置的一个射线,然后判断这个射线是否碰到你想要碰到的位置,如果碰到则实现逻辑过程。旋转缩放就是将摄像机围绕着汽车为轴心进行旋转,缩放就是改变摄像机的视角范围,原理就是这么简单,接着上代码:

1.开关车门:

using UnityEngine;
using System.Collections;

public class opendoor : MonoBehaviour {

    private bool isOpenDoor = false;
    private bool openDoor = false;
    private bool closeDoor = false;
    private int target = 0;
    int flag = 0;
    Ray ray;
    RaycastHit hitobj;
    private GameObject doorl;
	// Use this for initialization
	void Start () {
        doorl = GameObject.Find("doorL");

	}

	// Update is called once per frame
	void Update () {
        //画出射线
        ray = Camera.main.ScreenPointToRay(Input.mousePosition);
	    if (Input.GetMouseButtonDown(0))
	    {
            //鼠标点击车门
            if (Physics.Raycast(ray,out hitobj,1000))
            {
                print("ddd");
                Debug.DrawLine(ray.origin, hitobj.point);
                if (hitobj.collider.name == "doorL")
                {
                    print("111");
                    if (flag == 0)
                    {
                        openDoor = true;
                        closeDoor = false;
                    }
                    else
                    {
                        closeDoor = true;
                        openDoor = false;
                    }

                    flag++;
                    flag %= 2;
                }
            }
	    }
	    if (openDoor)
	    {
            //开门
            if (target < 40 && !isOpenDoor)
            {
                doorl.transform.Rotate(Vector3.forward, 1);
                target = target + 1;
            }
            else
            {
                isOpenDoor = true;
            }
	    }
	    if(closeDoor)
        {
            //关门
            if (isOpenDoor && target > 0)
            {
                doorl.transform.Rotate(-Vector3.forward, 1);
                target -= 1;
            }
            else
            {
                isOpenDoor = false;
            }
        }
	}
}

将以上代码添加到car模型上,然后点击鼠标实现开门和关门的一个简单效果,效果截图:

鼠标左键点击车门:

2.旋转缩放:

//旋转
        if (Input.GetMouseButtonDown(0))
        {
            p1 = new Vector2(Input.mousePosition.x, Input.mousePosition.y);//鼠标右键按下时记录鼠标位置p1
        }
        if (Input.GetMouseButton(0))
        {
            p2 = new Vector2(Input.mousePosition.x, Input.mousePosition.y);//鼠标右键拖动时记录鼠标位置p2
            //下面开始旋转,仅在水平方向上进行旋转
            float dx = p2.x - p1.x;
            float dy = (float)0.1*(p2.y - p1.y);
            transform.RotateAround(car.transform.position, Vector3.up, dx * Time.deltaTime);
            //鼠标上下移动
            //transform.Translate(dy*Vector3.up * Time.deltaTime);
            light.transform.RotateAround(car.transform.position, Vector3.up, dx*Time.deltaTime);
        }

        //鼠标滚轮控制场景大小
        // 如果按住滑轮
        if (Input.GetAxis("Mouse ScrollWheel") > 0)
        {
            Debug.Log(1);
            Debug.Log(Input.GetAxis("Mouse ScrollWheel"));

            if (normalDistance >= MouseZoomMin && normalDistance <= MouseZoomMax)
            {
                normalDistance -= Input.GetAxis("Mouse ScrollWheel") * MouseWheelSensitivity;
            }

            if (normalDistance < MouseZoomMin)
            {
                normalDistance = MouseZoomMin;
            }
            if (normalDistance > MouseZoomMax)
            {
                normalDistance = MouseZoomMax;
            }

            transform.camera.fieldOfView = normalDistance;

        }

        //后滚
        else if (Input.GetAxis("Mouse ScrollWheel") < 0)
        {
            Debug.Log(-1);
            if (normalDistance >= MouseZoomMin && normalDistance <= MouseZoomMax)
            {
                normalDistance -= Input.GetAxis("Mouse ScrollWheel") * MouseWheelSensitivity;
            }

            if (normalDistance < MouseZoomMin)
            {
                normalDistance = MouseZoomMin;
            }
            if (normalDistance > MouseZoomMax)
            {
                normalDistance = MouseZoomMax;
            }
           // transform.Translate(-transform.forward * normalDistance);
            transform.camera.fieldOfView = normalDistance;
        }

效果图:

关于Unity3D,我们有个专门技术讨论的大群,可以进行技术交流和咨询,群号:858550
欢迎进行技术讨论,里面有不少大牛

时间: 2024-10-28 17:35:54

[Unity3d]3D车展之汽车开门关门和旋转缩放的效果的实现的相关文章

多功能一体机SCX-3401FH屏幕显示“卡纸或缺纸,开门\关门”,如何解决

现 象:要复印和打印,机器屏幕显示"提示卡纸或缺纸,开门关门".   原 因: 1.进纸区发生卡纸.   2.纸盘中无纸.   解决方法如下:   一.检查纸盘中是否卡纸.   1.如果纸盘中纸张已经进入一半卡住了,这时请先打开.关闭前门,看纸张是否自动退出.   2.如果没有退出,请您通过手动取纸,慢慢将卡住的纸张拉出.     二.检查纸盘纸张放置.   1.打开纸盘,然后按照装入的介质大小调节纸盘大小.     2.请在装入纸张之前将纸张弯折或成扇形展开,使纸张分离.     3

三星激光黑白多功能一体机SCX-4321NS机器屏幕显示“卡纸或缺纸,开门/关门”,如何解决?

现 象:复印和打印时,机器屏幕显示"卡纸或缺纸,开门/关门".  原 因:             1.进纸区发生卡纸.              2.纸盘中无纸或纸张没有放置好.  解决方法如下: 一.检查进纸区是否发生卡纸.  1.纸盘中纸张进入一半就卡住了,这时请您先打开前门,再关闭前门,看纸张是否自动退出.     2.如果纸张没有退出,请您通过手动取纸,慢慢将卡住的纸张拉出.     

Unity3D实现鼠标对物体进行移动,旋转,缩放

问题描述 Unity3D实现鼠标对物体进行移动,旋转,缩放 现在想实现一个功能,当进入unity运行模式时,用鼠标点击需要观察的物体,使物体上出现坐标轴,方法缩小轴,旋转球(就是和编辑模式下是一样的),通过对这些坐标轴的控制可以实现对物体进行,移动,旋转,缩放!挺急的!小弟穷逼了!希望大神帮忙解惑!小弟在此谢过! 解决方案 http://www.cnblogs.com/fortomorrow/archive/2012/10/30/unity05.html 解决方案二: unity3d鼠标移动.旋

3D HTML5 Logo标志 超炫酷旋转特效

今天又要为大家带来一款超酷的HTML5 Canvas 3D动画特效,是一款可以旋转的HTML5 Logo标志.画面上一共有两块可旋转的区域,第一是可旋转的背景,第二则是可旋转的Logo标志.Logo标志在旋转的时候还有3D的视觉效果,这一切 我们都是在canvas上实现的.具体演示和实现过程可以看下文. 你也可以在这里查看在线演示 下面我们来简单分析一下实现这款3D动画的过程及其部分核心代码,主要由HTML代码以及Javascript代码组成. HTML代码: <canvas id="ca

unity3d:如何做GUI中图片的旋转

GUIUtility.RotateAroundPivot (6*Time1, Vector2(103, 200))为旋转GUI的代码,第一个参数为旋转的角度,第二个参数为旋转的中心点,在它之下的GUI元素都会执行该旋转,例如图片.文字等.当你只想旋转某一GUI元素而其他元素不旋转事就得给它一个停止旋转的代码.利用图片旋转写的一个钟表的代码如下: 为了便于测试,在钟表左边给出一个数字时间经行对比.getTime(time : float)可用于实现场景中时间的显示,或者倒计时的显示等. 查看本栏目

用 3D 打印技术完美复制名画,包括画笔笔触效果

class="post_content" itemprop="articleBody"> 3D 打印机可以做很多事情,而这次我们看到的则是与众不同的应用.来自荷兰的研究人员 Tim Zaman 研发出了这种 3D 复制技术,能够捕捉令人难以置信的细节,比如一幅画的笔触和纹理-- 你只需要扫描完一张画,就可以再现这张画的各个细节,包括笔触以及涂抹的痕迹等.它采用 Oce 打印机,能以 600 ppi 复制一张画作出来.这种染料打印机通过打印头来回移动多次,来表现

[unity3d]鼠标拖动and旋转缩放

using UnityEngine; using System.Collections; public class mouseRotateAndScale : MonoBehaviour { GameObject car; //public GameObject light; Vector2 p1, p2;//用来记录鼠标的位置,以便计算旋转幅度 // 鼠标中间键 int MouseWheelSensitivity = 5; int MouseZoomMin = 18; int MouseZoo

CSS网站作品资源分享:2012年做得不错的20个CSS网站

文章简介:2012年排名前20位的CSS网站作品. 2012年涌现出众多独特的,令人印象深刻的 CSS 网站作品,要从中挑选出年度应用 CSS 的最佳网站列表一个严峻的挑战,因为 CSS 涵盖了媒体查询(CSS3 Media Queries).CSS 动画和3D转换等众多特性.我根据过去 CSS 典型的应用场景挑选了其中的优秀作品组成一个列表,如果你有收藏更好的作品,欢迎留言向大家分享. 1. Beercamp 这个啤酒节的活动网站充分应用了 3D CSS Transform 技术,充满立体感的

WEBJX分享网站案例:2012年做的不错的CSS网站

文章简介:2012年涌现出众多独特的,令人印象深刻的 CSS 网站作品,要从中挑选出年度应用CSS 的最佳网站列表一个严峻的挑战,因为 CSS 涵盖了媒体查询(CSS3 Media Queries).CSS动画和3D转换等众多特性.我根据过去 CSS 典型的应用场景挑选了其中的优秀作品组成一个列表,如果你 2012年涌现出众多独特的,令人印象深刻的 CSS 网站作品,要从中挑选出年度应用CSS 的最佳网站列表一个严峻的挑战,因为 CSS 涵盖了媒体查询(CSS3 Media Queries).C