Unity实现360度可旋转、缩放单独看模型

一、说明:

实现模型的单独交互,显示在面板上,可以进行旋转和缩放操作。

二、代码演示:

using UnityEngine;

public class ModelShowControl : MonoBehaviour
{
    [SerializeField][Header("渲染展示相机")]
    private GameObject showCamera;
    [SerializeField][Header("展示交互的物品")]
    private GameObject showGameObject;
    
    
    [SerializeField][Header("是否自动旋转")]
    private bool isAutoRotate;
    [SerializeField][Header("自动旋转方向,例如(0,1,0)按照Y轴旋转")]
    private Vector3 autoRotateDirection;
    [SerializeField][Header("是否按照自身坐标系轴自动旋转")]
    private bool isAutoRotatePivot;
    [SerializeField][Header("自动旋转速度")]
    private float autoRotationSpeed = 5; 
    [SerializeField][Header("鼠标旋转速度")]
    private float mouseRotateSpeed = 0.5f;
    [SerializeField][Header("是否反向旋转X")]
    private bool isRotateInvertX;
    [SerializeField][Header("是否反向旋转Y")]
    private bool isRotateInvertY;
    [SerializeField][Header("缩放速度")]
    private float zoomSpeed = 0.5f;
    [SerializeField][Header("是否反向缩放")]
    private bool isZoomInvert;
    [SerializeField][Header("最近缩放距离")]
    private float minZoomDistance = 1f;
    [SerializeField][Header("最远缩放距离")]
    private float maxZoomDistance = 10f;
    
    private Vector3 cameraInitPos;
    private Vector3 lastMousePosition;
    private bool isRotating; //是否正在旋转
    private Vector3[] showGameObjectInitTrans = new Vector3[3];
    
    public static ModelShowControl Instance;
    private void Awake()
    {
        Instance = this;
        cameraInitPos = showCamera.transform.position;
    }



    public void SetShowGameObject(GameObject _gameObject)
    {
        showGameObjectInitTrans[0] = _gameObject.transform.position;
        showGameObjectInitTrans[1] = _gameObject.transform.eulerAngles;
        showGameObjectInitTrans[2] = _gameObject.transform.localScale;
        showGameObject = _gameObject;
        showCamera.transform.position = cameraInitPos;
    }

    public void RestoreShowGameObject()
    {
        showGameObject.transform.position = showGameObjectInitTrans[0];
        showGameObject.transform.eulerAngles = showGameObjectInitTrans[1];
        showGameObject.transform.localScale = showGameObjectInitTrans[2];
        showGameObject = null;
        showCamera.transform.position = cameraInitPos;
        isRotating = false;
    }

    void Update()
    {
        if (showGameObject == null)
            return;

        if (isAutoRotate && !Input.GetMouseButton(0)) // 如果鼠标左键没按下
            RotateModelContinuously(); // 持续旋转模型
        else
            RotateModelOnMouseDrag(); // 根据鼠标拖拽旋转模型

        ZoomCamera();
    }

    void RotateModelContinuously()
    {
        if (!isAutoRotatePivot)
            showGameObject.transform.Rotate(autoRotateDirection, autoRotationSpeed * Time.deltaTime, Space.World);
        else
        {
            var rotateEuler = autoRotateDirection * autoRotationSpeed * Time.deltaTime;
            // 根据模型当前朝向构造一个围绕轴旋转的四元数
            Quaternion deltaRotation = Quaternion.Euler(rotateEuler);
            // 将新的旋转应用到模型
            showGameObject.transform.rotation *= deltaRotation;
        }
    }

    void RotateModelOnMouseDrag()
    {
        if (Input.GetMouseButtonDown(0))
        {
            isRotating = true;
            lastMousePosition = Input.mousePosition;
        }
        else if (Input.GetMouseButtonUp(0))
        {
            isRotating = false;
        }

        if (isRotating && (Input.GetAxis("Mouse X") != 0 || Input.GetAxis("Mouse Y") != 0))
        {
            Vector3 currentMousePosition = Input.mousePosition;
            Vector3 mouseDeltaPosition = currentMousePosition - lastMousePosition;
        
            float rotationX = -mouseDeltaPosition.y * mouseRotateSpeed;
            float rotationY = mouseDeltaPosition.x * mouseRotateSpeed;
            showGameObject.transform.Rotate(Vector3.up, isRotateInvertX ? rotationY : -rotationY, Space.World);
            showGameObject.transform.Rotate(Vector3.right, isRotateInvertY ? rotationX : -rotationX, Space.World);

            lastMousePosition = currentMousePosition;
        }
    }

    void ZoomCamera()
    {
        // 获取鼠标滚轮的滚动值
        float scrollWheelInput = Input.GetAxis("Mouse ScrollWheel");
        if (scrollWheelInput == 0) return;
        // 计算缩放后的相机距离
        float zoomDistance = showCamera.transform.localPosition.z -
                             scrollWheelInput * (isZoomInvert ? zoomSpeed : -zoomSpeed);
        zoomDistance = Mathf.Clamp(zoomDistance, -maxZoomDistance, -minZoomDistance);

        // 设置相机距离
        showCamera.transform.localPosition = new Vector3(cameraInitPos.x, cameraInitPos.y, zoomDistance);
    }
}

三、使用说明: 

1.设置一个需要显示交互的模型相机 

2.将相机拖入ShowCamera中,需要展示的模型可以在运行时直接放入,需要使用

SetShowGameObject(showGameObject);//调用方法

也可以运行时添加显示模型:

ModelShowControl.Instance.SetShowGameObject(showGameObject);//调用方法

我配合鼠标射线检测进行如下调用(要展示的模型设置Tag为ModelShow):

using System;
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
using UnityEngine.UI;

public class ModelShowManager : MonoBehaviour
{
    public GameObject modelShowGameObjectParent;
    public GameObject modelShowPanel;
    public Button closeModelShowPanelBtn;

    private void Awake()
    {
        closeModelShowPanelBtn.onClick.AddListener(() =>
        {
            modelShowPanel.SetActive(false);
            ModelShowControl.Instance.RestoreShowGameObject();
        });
    }

    void Update()
    {
        if (Input.GetMouseButtonDown(0))
        {
            Ray ray = Camera.main.ScreenPointToRay(Input.mousePosition);
            RaycastHit hitInfo;
            
            if (Physics.Raycast(ray, out hitInfo))
            {
                if (hitInfo.collider.CompareTag("ModelShow"))
                {
                    modelShowPanel.SetActive(true);

                    
                    for (int i = 0; i < modelShowGameObjectParent.transform.childCount; i++)
                    {
                        var child = modelShowGameObjectParent.transform.GetChild(i).gameObject;
                        if (child.name == hitInfo.collider.gameObject.name)
                        {
                            child.SetActive(true);
                            ModelShowControl.Instance.SetShowGameObject(child);
                        }
                        else
                        {
                            child.SetActive(false);
                        }
                    }
                }
            }
        }
    }
}

3.添加一个New Render Texture给相机上

4.添加Image的UI,创建一个材质,选择

将New Render Texture赋给该材质,然后将材质赋给Image

四、演示结果

 

现在就可以360度显示模型,可以鼠标交互旋转缩放。

  • 4
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
Unity 是一款非常强大的游戏开发引擎,可以实现各种虚拟现实和仿真应用。要在 Unity 实现物体的360旋转缩放,可以通过以下步骤来完成。 首先,我们需要在 Unity 创建一个新的场景,并在场景添加一个需要旋转缩放的物体。可以是一个 3D 模型或者一个简单的立方体。 接下来,在场景创建一个空对象(Empty Object),将该空对象命名为 "RotationController"(旋转控制器)。 然后,将需要旋转缩放的物体作为子对象添加到旋转控制器下面。 接着,为旋转控制器添加脚本,并在脚本编写代码。 代码示例: using UnityEngine; public class RotationController : MonoBehaviour { public float rotationSpeed = 10f; public float scaleSpeed = 0.1f; void Update() { // 获取鼠标左右移动的距离并实现旋转 float rotationX = Input.GetAxis("Mouse X") * rotationSpeed * Time.deltaTime; transform.Rotate(0, rotationX, 0); // 获取鼠标滚轮的滚动距离并实现缩放 float scale = Input.GetAxis("Mouse ScrollWheel") * scaleSpeed; transform.localScale += new Vector3(scale, scale, scale); } } 通过以上代码,我们可以实现通过鼠标的左右移动来控制物体的旋转,同时通过鼠标的滚轮滚动来控制物体的缩放。 最后,将脚本组件添加到旋转控制器上,然后运行 Unity 场景,就可以通过鼠标来旋转缩放物体了。 以上就是使用 Unity 创建一个可以实现物体360旋转缩放的简单示例。这个方法可以应用于虚拟现实、游戏开发以及各种仿真应用

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

平杨猪

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值