Unity3D+EasyAR实现物理实验:光电效应

一、前言

关于下载EasyAR和配置在这里就不说了,可以参考文章:

  • Unity3D+EasyAR实现VR效果的案例

        实验的3D模型我都是自己用各个组件拼接的,有需要用的FBX的模型可以下载,给大家提供一个3DUnity模型下载的网址(我的手电筒模型就在上面下的)。

二、物理实验原理

Unity3D+EasyAR实现物理实验:光电效应_第1张图片

三、实验步骤

1、为了保证复用性,初步工作除了导入EasyAR包,我还建立了如下的文件夹,方便将来使用:

Unity3D+EasyAR实现物理实验:光电效应_第2张图片

2、建立好了,如下图(验电器和锌板的模型是我自己拼的)

Unity3D+EasyAR实现物理实验:光电效应_第3张图片

3、给手电筒light添加射线(Add Component->   Line Renderer  ),然后在light上加脚本,让其发出射线并且碰到锌板的时候会产生碰撞,射线不会穿过锌板

Unity3D+EasyAR实现物理实验:光电效应_第4张图片

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.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;
        }
    }
}

效果如下:

Unity3D+EasyAR实现物理实验:光电效应_第5张图片

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();
	}

    // 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().isclick() && isDrawLine)
        {
            point2.Rotate(Vector3.left * -30);
            isDobleRotate = false;
            count++;
        }
        else if (!postObject.GetComponent().isclick() && count==2)
        {
              count--;
              point2.Rotate(Vector3.left * 30);
              isDobleRotate = true;
        }
    }
}


5、将脚本绑定到post1上,选择对应的变量即可。

Unity3D+EasyAR实现物理实验:光电效应_第6张图片

四、实验结果

未连接时:

Unity3D+EasyAR实现物理实验:光电效应_第7张图片

连接验电器和锌板(指针偏转):

Unity3D+EasyAR实现物理实验:光电效应_第8张图片

手电筒灯光打到新版上(指针偏转幅度加大):

Unity3D+EasyAR实现物理实验:光电效应_第9张图片

你可能感兴趣的:(Unity3D)