归海一啸
管理员
管理员
  • 社区居民
  • 最爱沙发
  • 忠实会员
  • 喜欢达人
  • 原创写手
阅读:6575回复:15

Vuforia开发技巧七-用手指拖拽Augmented模型

楼主#
更多 发布于:2015-07-22 00:04
前面文章介绍了怎么对3D模型进行缩放、平移和旋转,
(Unity3d)Vuforia开发基础五-模型交互
这篇将会介绍如何通过手指拖拽平移模型。
思路:
1、通过绘制射线判断是否选中模型
2、然后根据手指在屏幕上的移动位置变化来移动模型
使用以下脚本,将脚本放到ARCamera下,确保模型具有mesh Collider 属性。
using UnityEngine;
using System.Collections;
public class DragObject : MonoBehaviour {
   private Transform pickedObject = null;
   private Vector3 lastPlanePoint;
   // Use this for initialization
   void Start () {
   }
   // Update is called once per frame
   void Update () {
//创建一个平面
        Plane targetPlane = new Plane(transform.up, transform.position);
        foreach (Touch touch in Input.touches) {
            //获取摄像头近平面到屏幕触摸点的射线
            Ray ray = Camera.main.ScreenPointToRay(touch.position);
            //获取射线沿着plane的距离
            float dist = 0.0f;
            targetPlane.Raycast(ray, out dist);
            //获取沿着射线在距离dist位置的点
            Vector3 planePoint = ray.GetPoint(dist);
            //Debug.Log("Point=" + planePoint);
            //按下手指触碰屏幕
            if (touch.phase == TouchPhase.Began) {
                 RaycastHit hit = new RaycastHit();
// 判断是否有碰撞到对象
                 if (Physics.Raycast(ray, out hit, 1000)) { 
                     pickedObject = hit.transform;
                     lastPlanePoint = planePoint;
                 } else {
                     pickedObject = null;
                 }
            //选中模型后拖拽
            } else if (touch.phase == TouchPhase.Moved) {
                 if (pickedObject != null) {
                     pickedObject.position += planePoint - lastPlanePoint;
                     lastPlanePoint = planePoint;
                 }
            //释放
            } else if (touch.phase == TouchPhase.Ended) {
                 pickedObject = null;
            }
        }
   }
}
通过前面教程中粗略计算手指在屏幕上的滑动位移也能够用来做类似的效果,只是精度相对来说差一些,需要手动调整。但是调整之后,效果还是挺好的
using UnityEngine;
using System.Collections;
public class DragObject : MonoBehaviour
{
    private Transform pickedObject = null;
    private Vector3 lastPlanePoint;
 
    private float x;
    private float y;
    // 移动加权,使移动与手指移动同步
    private float xSpeed = 2;
    // Use this for initialization
    void Start()
    {
    }
    // Update is called once per frame
    void Update()
    {
        //创建一个平面
        Plane targetPlane = new Plane(transform.up, transform.position);
        Debug.Log("position=" + transform.position);
        foreach (Touch touch in Input.touches)
        {
            //获取摄像头近平面到屏幕触摸点的射线
            Ray ray = Camera.main.ScreenPointToRay(touch.position);
            //获取射线沿着plane的距离
            float dist = 0.0f;
            targetPlane.Raycast(ray, out dist);
            //获取沿着射线在距离dist位置的点
            Vector3 planePoint = ray.GetPoint(dist);
            Debug.Log("Point=" + planePoint);
            //按下手指触碰屏幕
            if (touch.phase == TouchPhase.Began)
            {
                RaycastHit hit = new RaycastHit();
                // 判断是否有碰撞到对象
                if (Physics.Raycast(ray, out hit, 1000))
                {
                    pickedObject = hit.transform;
                    lastPlanePoint = planePoint;
                }
                else
                {
                    pickedObject = null;
                }
 
            }//选中模型后拖拽
            else if (touch.phase == TouchPhase.Moved)
            {
                if (pickedObject != null)
                {
                    // 设置移动位移
                    x = Input.GetAxis("Mouse X") * xSpeed;
                    pickedObject.position += new Vector3(x, 0, 0);
                    // 方法一
                    //pickedObject.position += planePoint - lastPlanePoint;
                    lastPlanePoint = planePoint;
                }
                //释放
            }
            else if (touch.phase == TouchPhase.Ended)
            {
                pickedObject = null;
            }
        }
    }
}
建议使用第二种方式。第一种方式经过测试,不是很灵敏,可能还需要进一步调整。

最新喜欢:

MelodyMelody abcde12345abcde1... LeoLeo
AR学院(www.arvrschool.com),从这里感触未来!

欢迎分享

Leo
Leo
骑士
骑士
  • UID8
  • 粉丝1
  • 关注2
  • 发帖数22
  • 社区居民
沙发#
发布于:2015-07-27 15:11
来抢沙发
ericbuaa
新手
新手
  • UID85
  • 粉丝0
  • 关注0
  • 发帖数7
板凳#
发布于:2015-08-19 17:07
这个跟手指旋转及缩放操作是否矛盾?
归海一啸
管理员
管理员
  • 社区居民
  • 最爱沙发
  • 忠实会员
  • 喜欢达人
  • 原创写手
地板#
发布于:2015-08-19 17:10
ericbuaa:这个跟手指旋转及缩放操作是否矛盾?回到原帖
这个是需要选中模型之后才起左右,另外是随便触碰屏幕任何位置都起作用。应用的好的话,不会矛盾
AR学院(www.arvrschool.com),从这里感触未来!
ericbuaa
新手
新手
  • UID85
  • 粉丝0
  • 关注0
  • 发帖数7
4楼#
发布于:2015-08-19 17:43
归海一啸:这个是需要选中模型之后才起左右,另外是随便触碰屏幕任何位置都起作用。应用的好的话,不会矛盾回到原帖
如何选中模型?该代码确定是拖到ARCamera吗?还是模型上?
归海一啸
管理员
管理员
  • 社区居民
  • 最爱沙发
  • 忠实会员
  • 喜欢达人
  • 原创写手
5楼#
发布于:2015-08-19 19:07
ericbuaa:如何选中模型?该代码确定是拖到ARCamera吗?还是模型上?回到原帖
ARCamera上,教程上有写
AR学院(www.arvrschool.com),从这里感触未来!
ericbuaa
新手
新手
  • UID85
  • 粉丝0
  • 关注0
  • 发帖数7
6楼#
发布于:2015-08-19 22:16
多谢
13577940807
新手
新手
  • UID305
  • 粉丝0
  • 关注0
  • 发帖数6
7楼#
发布于:2016-03-09 14:48
那有多个模型怎么办  要怎么锁定
归海一啸
管理员
管理员
  • 社区居民
  • 最爱沙发
  • 忠实会员
  • 喜欢达人
  • 原创写手
8楼#
发布于:2016-03-09 16:57
13577940807:那有多个模型怎么办  要怎么锁定回到原帖
再做个按钮,选中就是多选,不选默认单选
AR学院(www.arvrschool.com),从这里感触未来!
abcde12345
贫民
贫民
  • UID1139
  • 粉丝0
  • 关注0
  • 发帖数4
  • 社区居民
9楼#
发布于:2016-03-24 23:54
謝謝分享
liugang121
侠客
侠客
  • UID1197
  • 粉丝0
  • 关注1
  • 发帖数37
  • 社区居民
  • 忠实会员
10楼#
发布于:2016-05-17 16:15
归海大哥  float dist = 0.0f;
            targetPlane.Raycast(ray, out dist);
这两句有什么用处???
liugang121
侠客
侠客
  • UID1197
  • 粉丝0
  • 关注1
  • 发帖数37
  • 社区居民
  • 忠实会员
11楼#
发布于:2016-05-17 20:45
懂了懂了呵呵
AR红
新手
新手
  • UID2052
  • 粉丝0
  • 关注0
  • 发帖数6
12楼#
发布于:2016-07-26 18:13
y轴不用移动吗?那不就好生硬,只有x轴移动
归海一啸
管理员
管理员
  • 社区居民
  • 最爱沙发
  • 忠实会员
  • 喜欢达人
  • 原创写手
13楼#
发布于:2016-07-26 20:09
AR红:y轴不用移动吗?那不就好生硬,只有x轴移动回到原帖
教授个方法,授人以鱼不如授人以渔,哈哈
AR学院(www.arvrschool.com),从这里感触未来!
Allenpeng
新手
新手
  • UID3402
  • 粉丝0
  • 关注0
  • 发帖数2
14楼#
发布于:2017-01-13 09:50
移动速度好快....
上一页
游客

返回顶部