2013-04-17 13:18:15 zuoyamin 阅读数 19164
  1. World Space(世界坐标):我们在场景中添加物体(如:Cube),他们都是以世界坐标显示在场景中的。transform.position可以获得该位置坐标。            
  2. Screen Space(屏幕坐标:以像素来定义的,以屏幕的左下角为(00)点,右上角为(Screen.widthScreen.height),Z的位置是以相机的世界单位来衡量的。注:鼠标位置坐标属于屏幕坐标,Input.mousePosition可以获得该位置坐标,手指触摸屏幕也为屏幕坐标,Input.GetTouch(0).position可以获得单个手指触摸屏幕坐标。

  3. ViewPort Space(视口坐标):视口坐标是标准的和相对于相机的。相机的左下角为(00)点,右上角为(11)点,Z的位置是以相机的世界单位来衡量的。(用的不多,反正我暂时没有用到~呵呵~)

  4. 绘制GUI界面的坐标系:这个坐标系与屏幕坐标系相似,不同的是该坐标系以屏幕的左上角为(00)点,右下角为(Screen.widthScreen.height)。

  • 世界坐标屏幕坐标:camera.WorldToScreenPoint(transform.position);这样可以将世界坐标转换为屏幕坐标。其中camera为场景中的camera对象。

  • 屏幕坐标视口坐标:camera.ScreenToViewportPoint(Input.GetTouch(0).position);这样可以将屏幕坐标转换为视口坐标。其中camera为场景中的camera对象。

  • 视口坐标屏幕坐标:camera.ViewportToScreenPoint();

  • 视口坐标世界坐标:camera.ViewportToWorldPoint();
  • 案例1——在鼠标点击的位置上绘制一张图片出来(关于绘制GUI界面坐标系与屏幕坐标系之间的关系)。
    using UnityEngine;
     using System.Collections;
     public class test : MonoBehaviour   {        
          //图片  
        public Texture img;    
         //储存鼠标的位置坐标    
        private Vector2 pos;   
         void OnGUI()   
          {           
              //鼠标左击,获取当前鼠标的位置       
           if (Input.GetMouseButton(0))         
              {       
                   pos = Input.mousePosition;           
               }        
                 //绘制图片      
            GUI.DrawTexture(new Rect(pos.x,Screen.height - pos.y,100,100), img);       
          }   
    }
  • 案例2——坐标显示和坐标转换(这个是触摸方面的。如果没有触摸屏,那就将那个if去掉吧!
    using UnityEngine;   
    using System.Collections;   
    public class test: MonoBehaviour   {       
         //场景的相机,拖放进来      
        public Camera camera;        
         //场景的物体      
        private GameObject obj;    
          void Start()      
           {        
                //初始化      
            obj = GameObject.Find("Plane");       
            }       
             void Update ()     
             {            
                   //有触摸         
              if (Input.touchCount > 0)            
                   {                 
                       print("世界坐标" + obj.transform.position);                  
                        print("屏幕坐标" + Input.GetTouch(0).position);                  
                        print("世界坐标→屏幕坐标" + camera.WorldToScreenPoint(obj.transform.position));                  
                        print("屏幕坐标→视口坐标" + camera.ScreenToViewportPoint(Input.GetTouch(0).position));                 
                       print("世界坐标→视口坐标" + camera.WorldToViewportPoint(obj.transform.position));             
                }       
          } 
    }
  • 其他的情况大家自己实验下吧~

 

2018-01-16 18:39:55 linian71 阅读数 630

一、场景准备,建立一个简单的场景,一个平板在xz平面,一个红色小圆球代表原点,创建一个半径0.5的小球C位置在(0, 0.5, 0) 

二、创建Shader:

Shader中,将物体的世界坐标作为颜色传给fragment shader, Shader代码如下:

// Upgrade NOTE: replaced 'mul(UNITY_MATRIX_MVP,*)' with 'UnityObjectToClipPos(*)'

Shader "Unity Shader Book/Chapter5/SimpleShader" {

	SubShader {
		Pass {
			CGPROGRAM

			#pragma vertex vert
			#pragma fragment frag

			//add _Color
			//uniform fixed4 _Color;
			fixed4 _Color;

			struct a2v {
				float4 vertex : POSITION;
			};

			struct v2f {
				float4 pos : SV_POSITION;
				float3 color : COLOR0;	
			};

			v2f vert(a2v v) {
				v2f o;
				o.pos = UnityObjectToClipPos (v.vertex);
				 //这里除法是比例缩放,将世界坐标变换到合适的范围
				o.color = mul(_Object2World, v.vertex).xyz /1.0;   
				return o;
			}

			float4 frag(v2f i) : SV_Target {

//				float dis = length(i.color);
//				return float4(dis, dis, dis, 1.0);	//输出灰度时使用

				float3 f_color = abs(i.color);
				return float4(f_color, 1.0);
			}

			ENDCG
		}
	}
}
创建一个Material,把Shader绑定到Material;再将Material赋给小球C

三、测试

在编辑界面或者运行界面,沿着小球Local坐标系x, y, z轴拖动小球C,可以看到小球颜色变化。

(由于小球都在xz平面以上,y坐标大于零,初始在(0, 0.5, 0)位置时默认偏绿色,所以后面图片里蓝色、红色都和绿色混合了,说明小球表面上的y坐标值大于0)

小球在世界坐标系下:

沿着+-z轴移动时,变蓝色;


沿着+-x轴移动时,变红色;


沿着+-y轴移动时,变绿色;


2019-06-21 13:47:58 qq_40594848 阅读数 355
    /// <summary>
    /// 返回两个坐标点连线上的随机一点
    /// </summary>
    /// <param name="post1"></param>
    /// <param name="post2"></param>
    /// <returns></returns>
    public Vector3 GetPos(Vector3 post1, Vector3 post2)
    {
        Vector3 pos = Vector3.zero;
        float dis = Vector3.Distance(post1, post2);//计算距离
        Vector3 vector = (post2 - post1).normalized; //向量单位化
        float rand = Random.Range(0, dis);//随机距离
        pos = vector * rand; //得到新坐标
        pos += post1; //使新的坐标点在 post1与 post2之间
        return pos;
    }

 

2016-05-19 20:01:33 Gary_888 阅读数 702

Unity3D世界中的坐标系有四种:世界坐标系屏幕坐标系视口坐标系绘制UI界面的坐标系

1.世界坐标系

我们在场景中添加物体(Cube),他们都是以世界坐标显示在场景中。transform.position可以获取他们的世界坐标。

2.屏幕坐标

屏幕坐标是以像素为单位的,以屏幕左下角为(0,0),右上角为(Screen.width,Screen.height),z的位置是以相机的世界单位来衡量的。
注:鼠标位置坐标属于屏幕坐标,Input.mousePosition可以获得该位置坐标,手指触摸屏幕也为屏幕坐标,Input.GetTouch(0).position可以获得单个手指触摸屏幕的坐标。
Screen.width=Camera.pixelWidth;
Screen.height=Camera.pixelHeight;

3.ViewPort Space(视口坐标)

视口坐标是标准的和相对于相机的。相机的左下角为(0,0)点,右上角为(1,1)点,z的位置是以相机的世界单位来衡量的。

4.绘制GUI界面的坐标系

这个坐标与屏幕坐标相似,不同的是该坐标系以屏幕的左上角为(0,0)点,右下角为(Screen.width,Screen.height)。

四种坐标系的转换:

1.世界坐标→屏幕坐标:Camera.WorldToScreenPoint(transform.position);
2.屏幕坐标→视口坐标:Camera.ScreenToViewPortPoint(Input.GetTouch(0).position);
3.视口坐标→屏幕坐标:Camera.ViewportToScreenPoint();
4.视口坐标→世界坐标:Camera.ViewportToWorldPoint();

unity开发获取active为false的物体

博文 来自: liuweiyuxiang

Unity3D-各种坐标系

阅读数 815

unity3d坐标体系

阅读数 16

没有更多推荐了,返回首页