Unity项目 HTCvive物理实验室器件制作

物理实验室器件制作

永动机:

永动机模型分为三部分,分别是重力球、转盘、基座。

基座是静止不动的。在基座上添加collider,以及铰链组件。

通过unity的铰链与轮盘中心相连,使得转盘被固定,并且转盘只能按照教练规定的轴旋转。

(取消轮盘与基座的碰撞,避免在转动过程中个,产生不必要的碰撞)


转盘内部,建模的时候分为一个个的隔间,在场景中,为每个隔间的周围添加box collider碰撞。每个隔间中放置一个小球,在小球上也添加sphere collier球形碰撞,添加rigidbody刚体,调整其大小和质量,使小球能在隔间内自由运动并带动整个转盘转动。

为了模拟理想状态下永动机转动不停的效果,给转盘添加force组件,给予一个同方向的初始力让转盘转动。

之后在转动方向上持续给予一个relative force恒力。调整各部分组件的大小和质量。


摆钟实验:

模型,分为多个摆球,摆球与基座的悬挂绳,和一个用来悬挂摆球的基座。

在基座的两条悬挂杆上面设置铰链组件,将所有的摆球的悬挂绳与基座链接,只能够沿规定的轴旋转。

在作数第二个球和右数第二个摆球上面添加脚本,用来接收最边上的小球的撞击作用力,然后传递给另一侧的小球。

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

public class GetAndSetForce : MonoBehaviour {
    private Rigidbody getBody;
    public Rigidbody setBody;
    private Vector3 vel;
    public float addRate;

    // Use this for initialization
    void Start () {
        getBody = this.GetComponent<Rigidbody>();
	}
	
	// Update is called once per frame
	void Update () {
		
	}

    void OnCollisionEnter(Collision c)
    {
        Vector3 tempVel = c.gameObject.GetComponent<Rigidbody>().velocity;

        if (c.gameObject.tag == "ball" )
        {
            vel.x = tempVel.x*addRate;
            vel.y = tempVel.y*addRate;
            vel.z = tempVel.z*addRate;


            c.gameObject.GetComponent<Rigidbody>().velocity = Vector3.zero;
            setBody.velocity = vel;
        }
    }

}

例如,提起右侧的小球,将其放下,小球产生的作用力被右侧第二个球记录,再将这个作用力传递给左数第二个球,在又左侧第二个球传递给最左侧的小球,最左侧的小球受力飞起,之后循环次过程。在没有摩擦力的虚拟环境中,这个过程会一直持续下去。

为了模仿理想情况下的力的传递没有损耗,可以将传递后的力放大,再施加。

最后调整模型的大小和质量,以及力的传递后放大的倍数,实现虚拟理想情况下钟摆实验。

猜你喜欢

转载自blog.csdn.net/qq_34272906/article/details/80377616