2019-03-01 16:29:42 q764424567 阅读数 1058

一、前言

本篇文章讲的是如何让3D物体放光的方法

二、效果

在这里插入图片描述
在这里插入图片描述

三、实现

这个是一个插件,但是主要就是这几个脚本加Shader
在这里插入图片描述
资源包下载:
链接:https://pan.baidu.com/s/1mfZWPsUsbgvH2ACUTBW7Hg
提取码:5207
或者
https://download.csdn.net/download/q764424567/11188790

操作步骤

1.主摄像机上面添加HighlightingEffect脚本
在这里插入图片描述
2.要发光的物体上面添加这两个脚本
在这里插入图片描述

OK,搞定了

2017-10-10 10:33:04 qq_30087879 阅读数 2239

在update中检测

首先要在摄像机中添加组件Physics Raycaster

public void Update(){
if(Input.getMouseButtonUp(0)){
Ray ray = Camera.main.ScreenPointToRay(Input.mousePosition);
RaycastHit rayhit;
if(Physics.Raycast(ray,out rayhit)){
debug.log(rayhit.collider.gamaObject.name);

}
}


 

2019-11-06 21:02:49 q943520218 阅读数 164

     在3D世界里,物体有位置和姿态信息,位置很好理解,就是在空间中的坐标,有绝对坐标(position,世界坐标)和相对坐标(localPosition,相对于父物体的坐标)。

     姿态就不好理解了,描述的是物体旋转,有三个姿态,偏航,俯仰,翻滚。

     分别是物体按照x,y,z三轴旋转的结果

     旋转在unity3d中用四元数来表示,四元数的一种超复数,由一个实部和3个虚部组成,可以表示物体的旋转

     四元数 =  a+ bi + cj + dk; 满足下面公式:

     i^{2} = j^{2} = k^{2} = i*j*k = -1 

     i^{0} = j^{0} =k ^{0} = 1

    具体可以自补数学

    还有一点旋转是不满足交换律的,例如把一个长方体,先向右旋转90度,再向前旋转90度的结果,与先向前旋转90再向右旋转90度的结果是不一样的。

     说了这么多今天来做些什么呢?

     现在有如下问题:

        卫星在地球表面上绕地球转,卫星是有天线的,他的天线方向总是垂直于地球,不然就没法发送信号给地球,现在已知地球位置和卫星位置,把卫星旋转到合适的角度,卫星天线默认Y轴朝上

       实现如下:

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

public class RotationaSatellite : MonoBehaviour
{
    public Transform _earth;

    // Start is called before the first frame update
    void Start()
    {
        
    }

    // Update is called once per frame
    void Update()
    {
        Vector3 v1 = _earth.position - transform.position;
        v1.Normalize();
        Vector3 v2 = transform.up;

        Vector3 vertical_v1_and_v2 = Vector3.Cross(v2, v1);
        vertical_v1_and_v2.Normalize();
        float angle = Vector3.Angle(v2, v1);

        transform.rotation = transform.rotation * Quaternion.AngleAxis(angle, vertical_v1_and_v2) ;

    }
}

     代码如上:

     解释如下:

    1、 这其实是个数学问题,首先物体有一个up方向,就是天线方向,先获取卫星的天线方向向量 即 transform.up

          再根据卫星位置和地球位置计算一个向量,该向量就是天线需要选择到的终点

    2、已知了两个向量A,B,进行归一化

          我们知道两个不重合且方向不相反的向量可以构建一个平面

    3、而通过向量的叉乘可以得到垂直于A、B两条向量的一个向量C,该向量C为旋转轴

         即A向量通过绕C轴向量旋转\Phi度就能到达B向量的位置

    4、下一步就是求需要选择的角度

         通过向量的点乘可以得到角度,在c#中有一个求角度的函数Angle

    5、有了角度和旋转轴,即可构造四元数,把原有rotation * 新构建的四元数即为旋转后的姿态。

    效果如下:

    我们发现,不管卫星如何运动,卫星天线已经于地球表面保存垂直了。

2018-12-07 22:16:15 wang18236618195 阅读数 137

**

Unity3D 物体移动方法总结

**
1. 简介
在Unity3D中,有多种方式可以改变物体的坐标,实现移动的目的,其本质是每帧修改物体的position。

2. 通过Transform组件移动物体
Transform 组件用于描述物体在空间中的状态,它包括 位置(position), 旋转(rotation)和 缩放(scale)。 其实所有的移动都会导致position的改变,这里所说的通过Transform组件来移动物体,指的是直接操作Transform来控制物体的位置(position)。

2.1 Transform.Translate
该方法可以将物体从当前位置,移动到指定位置,并且可以选择参照的坐标系。 当需要进行坐标系转换时,可以考虑使用该方法以省去转换坐标系的步骤

if (Input.GetKey(KeyCode.W) || Input.GetKey(KeyCode.UpArrow)) //上移
{
transform.Translate(Vector3.up * speed * Time.deltaTime);
}
if (Input.GetKey(KeyCode.S) || Input.GetKey(KeyCode.DownArrow)) //下移
{
transform.Translate(Vector3.down * speed * Time.deltaTime);
}
if (Input.GetKey(KeyCode.A) || Input.GetKey(KeyCode.LeftArrow)) //左移
{
transform.Translate(Vector3.left * speed * Time.deltaTime);
}
if (Input.GetKey(KeyCode.D) || Input.GetKey(KeyCode.RightArrow)) //右移
{
transform.Translate(Vector3.right * speed * Time.deltaTime);
}
if (Input.GetKey(KeyCode.E)) //前移
{
transform.Translate(Vector3.forward * speed * Time.deltaTime);
}
if (Input.GetKey(KeyCode.R)) //后移
{
transform.Translate(Vector3.back * speed * Time.deltaTime);
}

2.2 Vector3.Lerp, Vector3.Slerp, Vector3.MoveTowards
Vector3 既可以表示三维空间中的一个点,也可以表示一个向量。这三个方法均为插值方法, Lerp为线性插值,Slerp为球形插值, MoveTowards在Lerp的基础上增加了限制最大速度功能。 当需要从指定A点移动到B点时,可以考虑时候这些方法。

//A点到B点移动的两种方法:MoveTowards和Lerp
if (Input.GetKey(KeyCode.W))
{
transform.position = Vector3.MoveTowards(transform.position, target.position, stmp);
}

if (Input.GetKeyDown(KeyCode.D))
{
transform.position = Vector3.Lerp(transform.position, target.position, stmp);
}

///
/// 按钮点击移动,点到点的
///
void OnGUI()
{
if(GUI.Button(new Rect(0, 0, 100, 100), “移动”))
{
transform.position = Vector3.Lerp(transform.position, target.position, speed);
}

//Rect中四个量分别代表:屏幕x的位置,屏幕Y的位置,按钮高度,按钮长度
}

2.3 Vector3.SmoothDamp
该方法是可以平滑的从A逐渐移动到B点,并且可以控制速度,最常见的用法是相机跟随目标。

2.4 Transform.position
有时重新赋值position能更快实现我们的目标。

3. 通过Rigidbody组件移动物体
Rigidbody组件用于模拟物体的物理状态,比如物体受重力影响,物体被碰撞后的击飞等等。

注意:关于Rigidbody的调用均应放在FixedUpdate方法中,该方法会在每一次执行物理模拟前被调用。

3.1 Rigidbody.velocity
设置刚体速度可以让物体运动并且忽略静摩擦力,这会让物体快速从静止状态进入运动状态。

3.2 Rigidbody.AddForce
给刚体添加一个方向的力,这种方式适合模拟物体在外力的作用下的运动状态。

3.3 Rigidbody.MovePosition
刚体受到物理约束的情况下,移动到指定点。

4. 通过CharacterController组件移动物体
CharacterController用于控制第一人称或第三人称角色的运动,使用这种方式可以模拟人的一些行为,比如限制角色爬坡的最大斜度,步伐的高度等。

4.1 CharacterController.SimpleMove
用于模拟简单运动,并且自动应用重力,返回值表示角色当前是否着地。

4.2 CharacterController.Move
模拟更复杂的运动,重力需要通过代码实现,返回值表示角色与周围的碰撞信息。

2015-05-19 13:40:34 yangyisen0713 阅读数 9549

主要涉及函数:

Input.GetAxis(“Mouse x”) 可取得鼠标横向(x轴)移动增量

Input.GetAxis(“Mouse y”) 可取得鼠标竖向(y轴)移动增量

通过勾股定理获取拖拽长度,长度越长旋转越快。在project setting--Input 可以设置。

这里用Cube来做例子,因为方体看旋转比较清楚,如图:


代码如下:

using UnityEngine;
using System.Collections;

public class NewBehaviourScript : MonoBehaviour {

	private bool onDrag = false;  //是否被拖拽//    
	public float speed = 6f;   //旋转速度//    
	private float tempSpeed;   //阻尼速度// 
	private float axisX = 1;
	//鼠标沿水平方向移动的增量//   
	private float axisY = 1;    //鼠标沿竖直方向移动的增量//   
	private float cXY;
	void OnMouseDown()
	{
		//接受鼠标按下的事件// 
		
		axisX = 0f; axisY = 0f;
	}
	void OnMouseDrag()     //鼠标拖拽时的操作// 
	{
		
		onDrag = true;
		axisX = -Input.GetAxis("moveX");
		//获得鼠标增量// 
		axisY = Input.GetAxis("moveY");
		cXY = Mathf.Sqrt(axisX * axisX + axisY * axisY); //计算鼠标移动的长度//
		if (cXY == 0f) { cXY = 1f; }
		
	}
	float Rigid()      //计算阻尼速度//    
	{
		if (onDrag)
		{
			tempSpeed = speed;
		}
		else
		{
			if (tempSpeed > 0)
			{
				tempSpeed -= speed * 2 * Time.deltaTime / cXY; //通过除以鼠标移动长度实现拖拽越长速度减缓越慢// 
			}
			else { 
				tempSpeed = 0; 
			}
		}
		return tempSpeed;
	}
	
	void Update()
	{
		// this.transform.Rotate(new Vector3(axisY, axisX, 0) * Rigid(), Space.World); //这个是是按照之前方向一直慢速旋转
		if (!Input.GetMouseButton(0))
		{ 
			onDrag = false;
			this.transform.Rotate(new Vector3(axisY, axisX, 0)*0.5f, Space.World); 
		}
	}
}

最终效果如图:




unity 3d 鼠标旋转物体脚本

博文 来自: dickysun1987

Unity3D 物体移动方式总结

博文 来自: qq_44884706

Unity3D物体穿过问题

阅读数 8681

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