一、前言
关于下载EasyAR和配置在这里就不说了,可以参考文章:
实验的3D模型我都是自己用各个组件拼接的,有需要用的FBX的模型可以下载,给大家提供一个3DUnity模型下载的网址(我的手电筒模型就在上面下的)。
二、物理实验原理
三、实验步骤
1、为了保证复用性,初步工作除了导入EasyAR包,我还建立了如下的文件夹,方便将来使用:
2、建立好了,如下图(验电器和锌板的模型是我自己拼的)
3、给手电筒light添加射线(Add Component-> Line Renderer ),然后在light上加脚本,让其发出射线并且碰到锌板的时候会产生碰撞,射线不会穿过锌板
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
public class move : MonoBehaviour {
public LineRenderer linerenderer;
bool click = false;
// Use this for initialization
void Start()
{
linerenderer = GetComponent<LineRenderer>();
linerenderer.positionCount = 2;
}
void Update()
{
//以摄像机所在位置为起点,创建一条向下发射的射线
Ray ray = new Ray(transform.position, transform.up);
RaycastHit hit;
if (Physics.Raycast(ray, out hit, Mathf.Infinity))
{
click = true;
// 如果射线与平面碰撞,打印碰撞物体信息
Debug.Log("碰撞对象: " + hit.collider.name);
// 在场景视图中绘制射线
linerenderer.SetPosition(0, ray.origin);
linerenderer.SetPosition(1, hit.point);
}
else
{
click = false;
linerenderer.SetPosition(0, transform.position);
linerenderer.SetPosition(1, transform.position + transform.up * 100);
}
}
public bool isclick() {
if (click)
{
return true;
}
else {
return false;
}
}
}
效果如下:
4、连接锌板的接线柱post1和验电器接线柱post2,我让接线柱post1为发出射线的起点(给其设置Line Renderer),脚本的作用:
- 连接锌板和验电器的接线柱时,验电器的指针point2(紫色指针)旋转30度,当两个模型大于一定距离,断开连接,指针回到原点;
- 连接锌板和验电器的接线柱后,用手电筒的紫外线光源照射锌板,验电器的指针point2(紫色指针)旋转60度,去掉光源,验电器指针回到30度,锌板和验电器断开,指针回到原点。
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
public class link : MonoBehaviour {
//锌板接线柱
public Transform postXin;
//验电器接线柱
public Transform postYan;
//验电器紫色动的指针
public Transform point2;
public GameObject postObject;
//LineRenderer
public LineRenderer lineRenderer;
//直线连接点
private Vector3 position1, position2;
bool isDrawLine = false; //是否绘制连线
float distance = 0; //锌板接线柱和验电器接线柱距离
bool isRotate = true;//控制point2是否旋转
bool isDobleRotate = true; //是否二次旋转
int count = 0;
// Use this for initialization
void Start () {
distance = Vector3.Distance(postXin.position, postYan.position);
// lineRenderer = post1.AddComponent<LineRenderer>();
}
// Update is called once per frame
void Update() {
//如果接线柱达到一定距离进行连接
if (Vector3.Distance(postXin.position, postYan.position) < distance)
{
lineRenderer.enabled = true;
isDrawLine = true;
}
if (isDrawLine)
{
position1 = new Vector3(postXin.position.x, postXin.position.y, postXin.position.z);
position2 = new Vector3(postYan.position.x, postYan.position.y, postYan.position.z);
lineRenderer.SetPosition(0, position1);
lineRenderer.SetPosition(1, position2);
}
if (Vector3.Distance(postXin.position, postYan.position) > distance * 1.5)
{
lineRenderer.enabled = false;
isDrawLine = false;
if (count>0) {
count--;
isRotate = true;//如果指针回到初始位置则时刻准备旋转
point2.Rotate(Vector3.left * 30);
}
}
if (isRotate && isDrawLine) {
point2.Rotate(Vector3.left * -30);
isRotate = false;
count++;
}
//获取light模型move脚本中的isclick方法
if (isDobleRotate && postObject.GetComponent<move>().isclick() && isDrawLine)
{
point2.Rotate(Vector3.left * -30);
isDobleRotate = false;
count++;
}
else if (!postObject.GetComponent<move>().isclick() && count==2)
{
count--;
point2.Rotate(Vector3.left * 30);
isDobleRotate = true;
}
}
}
5、将脚本绑定到post1上,选择对应的变量即可。
四、实验结果
未连接时:
连接验电器和锌板(指针偏转):
手电筒灯光打到新版上(指针偏转幅度加大):