unity3D 从摄像机发射射线,检测画线

原创 2013年12月03日 10:20:16

                最近做项目的时候,有一个需要从摄像机发出一条射线,当射线检测到有碰撞物体的时候,点击鼠标左键开始画线。我是创立了一个平板drawing,当然Cube什么的也是可以的。

                c#脚本代码,将这个脚本拖到摄像机里,然后拖拽材质到画线材质,拖拽碰撞体到脚本那里即可以。

                代码脚本:

using UnityEngine;
using System.Collections;

public class test : MonoBehaviour {

    //-----------划线所能够用到材质
     public Material lineMaterial  ;
	//
      int maxPoints = 5000;
      //全局变量的定义方法
     public static float lineWidth = 4.0f;
	 int minPixelMove = 2;	// Must move at least this many pixels per sample for a new segment to be recorded
     public Vector2[] linePoints;
     private VectorLine  line ;
     private int  lineIndex = 0;
      private   Vector2   previousPosition;
      private int  sqrMinPixelMove ;
      private bool canDraw = false;
    //记录当下画板的位置,判断平板是否平移等
      public Vector3 boardPosition;
      public GameObject board;
	//记录当下画板的大小,判断画板是否缩放等	
	 public Vector3 boardScale;	
	//初始化平板的大小与位置
	void IntializeScaleAndPosition()
	{
		boardPosition=Camera.mainCamera.WorldToScreenPoint(board.transform.position);
	    boardScale=board.transform.localScale;
		
	}
	// 初始化
	void Start () {
        linePoints = new Vector2[maxPoints];
        line = new VectorLine("DrawnLine", linePoints,lineMaterial, lineWidth, LineType.Continuous);
        sqrMinPixelMove = minPixelMove * minPixelMove;
		IntializeScaleAndPosition();
	}
	// Update is called once per frame
	void Update () {
        Vector2 mousePos = Input.mousePosition;
		//当画板移动时,将所有的点按照统一方向移动相同的距离
		//当前画板的位置
	   Vector3 currentBoardPositon=Camera.mainCamera.WorldToScreenPoint(board.transform.position);
		
		//画板的移动距离
		Vector3  moveDistance=currentBoardPositon-boardPosition;
		
	    if(moveDistance.x!=0||moveDistance.y!=0)
		{
			//将所有的画下的点都平移
			for(int i=0;i<linePoints.Length;i++)
			{
			Vector2 dis=new Vector2(moveDistance.x,moveDistance.y);
			linePoints[i]+=dis;
			}
			//销毁当前画下的线
		    Vector.DestroyLine(ref line);
			
			//距离平移后,所有的点的位置已经重新获得,重新画下新的线
			
			 line = new VectorLine("DrawnLine", linePoints, lineMaterial, lineWidth, LineType.Continuous);
			 line.minDrawIndex = 1;
	         line.maxDrawIndex = lineIndex;
		    Vector.DrawLine(line);
			
		}	
		boardPosition=Camera.mainCamera.WorldToScreenPoint(board.transform.position);
        //平板的缩放操作,对平板进行缩放,同时画出的线也要能够实现缩放。
		//检测平板是否已经开始缩放
		float currentScale=board.transform.localScale.x;
		float scaleFactor=currentScale/(boardScale.x);
		//Debug.Log("scaleFactor "+scaleFactor+" currentScale "+currentScale+" boardScale "+boardScale.x);
		boardScale=board.transform.localScale;
	    if(scaleFactor!=1||scaleFactor!=1)
		{	
			// 求出画板中心的位置
		    Vector3 boardPostionToSceern=Camera.mainCamera.WorldToScreenPoint(board.transform.position);
			
			  //当平板缩放时,所有的点都要同比例缩放。
			for(int i=0;i<linePoints.Length;i++)
			{
			Vector3 pointPositon=new Vector3(linePoints[i].x,linePoints[i].y,0);
			Vector3 PointToCenterDistance=(pointPositon-boardPostionToSceern)*scaleFactor;
			linePoints[i]=new Vector2((boardPostionToSceern+PointToCenterDistance).x,(boardPostionToSceern+PointToCenterDistance).y);
			}		
			//销毁当前画下的线
		    Vector.DestroyLine(ref line);
			//画板缩放后,所有的点的位置已经重新获得,重新画下新的线
			 line = new VectorLine("DrawnLine", linePoints, lineMaterial, lineWidth, LineType.Continuous);
			 line.minDrawIndex = 1;
	         line.maxDrawIndex = lineIndex;
		    Vector.DrawLine(line);	
		}
		//从摄像头发出一条射线
		Ray ray=Camera.mainCamera.ScreenPointToRay(Input.mousePosition);
	    RaycastHit hit;
		if(Physics.Raycast(ray,out hit,1000))
		{	
		//检测到物体时才开始画
		if(hit.transform.gameObject.name=="drawing")
		{		
		    if (Input.GetMouseButtonDown(0))
	        {
	          //  Vector.ZeroPointsInLine(line);
	           // line.minDrawIndex = lineIndex;
	          //  Vector.DrawLine(line);
	           // linePoints[lineIndex] = mousePos;
	            previousPosition  = mousePos;
	            lineIndex++;
	            linePoints[lineIndex] = mousePos;
	            canDraw = true;
	        }
	        else if (Input.GetMouseButton(0) && (mousePos - previousPosition).sqrMagnitude > sqrMinPixelMove && canDraw)
	        {
	            previousPosition = linePoints[++lineIndex] = mousePos;
	            line.minDrawIndex = lineIndex - 1;
	            line.maxDrawIndex = lineIndex;
	            if (lineIndex >= maxPoints - 1) canDraw = false;
	            Vector.DrawLine(line);
	        }				
		}	
	}

                 
版权声明:本文为博主原创文章,未经博主允许不得转载。

unity3d射线的原理用法以及一个利用射线实现简单拾取的小例子

unity3d射线的原理用法以及一个利用射线实现简单拾取的小例子 最近开始研究U3D,它的强大就不多说了, 今天研究了研究射线相关东西,总结了些东西放上来,一来做个笔记,二来和大家分享分享!嘿嘿...
  • Highning0007
  • Highning0007
  • 2014年07月20日 13:47
  • 23519

Physics.Raycast和Ray(射线)的理解

在游戏中,我们常常要用到鼠标来控制物体的移动或是鼠标拾取某个物体。还有射击游戏里,子弹打中靶子......这些都需要Physics.Raycast和ray。可见他们的重要性。 首先说说射线; 射线...
  • ElyXiao
  • ElyXiao
  • 2016年03月12日 16:25
  • 8709

Unity3d 发射射线Ray

Ray Camera.main.ScreenPointToRay(Vector3 pos)   返回一条射线Ray从摄像机到屏幕指定一个点 Ray Camera.main.ViewportPoi...
  • a350203223
  • a350203223
  • 2014年11月11日 21:15
  • 4454

Unity中发射射线

在Unity中发射射线,从任意GameObject或者屏幕上鼠标位置发射。 void Update() { // 点击鼠标左键时发射射线 if (Input.GetMouseButt...
  • qq_21397217
  • qq_21397217
  • 2017年11月08日 11:00
  • 362

unity3d问题集 <3> 对Physics.Raycast和Ray(射线)的理解

在游戏中,我们常常要用到鼠标来控制物体的移动或是鼠标拾取某个物体。还有射击游戏里,子弹打中靶子......这些都需要Physics.Raycast和ray。可见他们的重要性。 首先说说射线; 射线...
  • hbwangll
  • hbwangll
  • 2015年11月14日 12:24
  • 2881

【Unity】场景中有两个摄像机时射线检测不到问题

这两天想实现一个功能,当摄像机A旋转视野时,希望物体B一直保持显示在画面的固定位置,并且朝向保持不变。 于是我另外加了一个摄像机C,将物体B设置成UI层,摄像机C专门显示UI层,当摄像机A旋转...
  • zhenzhenyun
  • zhenzhenyun
  • 2017年01月06日 18:47
  • 918

Unity 3D中的射线(上)

在我们的游戏开发过程中,有一个很重要的工作就是进行碰撞检测。例如在射击游戏中子弹是否击中敌人,在RPG游戏中是否捡到装备等等。在进行碰撞检测时,我们最常用的工具就是射线,Unity 3D的物理引擎也为...
  • kstarlin
  • kstarlin
  • 2015年01月24日 20:42
  • 3561

【Unity&射线&可视化辅助】画线基础

先声明 #if UNITY_EDITOR using UnityEditor; #endif 在该函数下面,下上对应需求的代码    void OnDrawGizmos()//画一个立方体,用于判...
  • BuladeMian
  • BuladeMian
  • 2017年01月31日 20:17
  • 2318

Unity 3D中的射线与碰撞检测

在我们的游戏开发过程中,有一个很重要的工作就是进行碰撞检测。例如在射击游戏中子弹是否击中敌人,在RPG游戏中是否捡到装备等等。在进行碰撞检测时,我们最常用的工具就是射线,Unity 3D的物理引擎也为...
  • u014805066
  • u014805066
  • 2016年09月06日 22:44
  • 11497

unity3D 从摄像机发射射线,检测画线

最近做项目的时候,有一个需要从摄像机发出一条射线,当射线检测到有碰撞物体的时候,点击鼠标左键开始画线。我是创立了一个平板drawing,当然Cube什么的也是可以的。                ...
  • u012805027
  • u012805027
  • 2013年12月03日 10:20
  • 3395
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:unity3D 从摄像机发射射线,检测画线
举报原因:
原因补充:

(最多只允许输入30个字)