Помогите со скриптом на физику машины

Физика в Unity

Помогите со скриптом на физику машины

Сообщение obi.stas 24 мар 2013, 09:55

У меня есть java скрипт на физику машины, но я не могу понять, как добавить центр тяжести машине.Вот скрипт:

// VehicleBehaviourScript.js
//
// Created by: Greg Bassett
// Company: A-Lab Software Limited (http://www.alabsoft.com)
//
// Version: 1.5
//
// Usage: Attach to the VehicleRig prefab, and assign the wheel colliders within the vehicle rig.
//
// Copyright © A-Lab Software Limited 2010
//

import System.IO;

var colliderFL : WheelCollider;
var colliderFR : WheelCollider;
var colliderRL : WheelCollider;
var colliderRR : WheelCollider;

private var wheelFL : Transform;
private var wheelFR : Transform;
private var wheelRL : Transform;
private var wheelRR : Transform;

var MaxSteeringAngle : float = 20;
var MaxEngineSpeed : float = 150;
var Drive : String = "FWD";

private var CoG : Transform;

private var steer : float = 0;
private var forward = 0;
private var back = 0;
private var brakeRelease = false;
private var motor : float = 0;
private var brake : float = 0;
private var reverse = false;
private var speed = 0;

private var ColliderCenterPointFL : Vector3;
private var ColliderCenterPointFR : Vector3;
private var ColliderCenterPointRL : Vector3;
private var ColliderCenterPointRR : Vector3;

private var hit : RaycastHit;

private var windowRect : Rect;
private var linefeed : int=20;

private var bShowDialog : boolean = true;

private var RotationValueFL : float = 0.0;
private var RotationValueFR : float = 0.0;

private var RigType : String = "AlabCar";

function Start() {
wheelFL = transform.Find("/" + name + "/Wheels/FLWheel");
wheelFR = transform.Find("/" + name + "/Wheels/FRWheel");
wheelRL = transform.Find("/" + name + "/Wheels/RLWheel");
wheelRR = transform.Find("/" + name + "/Wheels/RRWheel");

CoG = transform.Find("/" + name + "/CenterOfGravity");
rigidbody.centerOfMass = Vector3(0, CoG.localPosition.y, 0);
}

function Update () {

if (Input.GetKeyDown (KeyCode.H)) {
if (bShowDialog == true) {
bShowDialog = false;
} else {
bShowDialog = true;
}
}

colliderFL.steerAngle = MaxSteeringAngle * Input.GetAxis("Horizontal");
colliderFR.steerAngle = MaxSteeringAngle * Input.GetAxis("Horizontal");

if(Drive=="FWD" || Drive=="4WD") {
colliderFL.motorTorque = MaxEngineSpeed * Input.GetAxis("Vertical");
colliderFR.motorTorque = MaxEngineSpeed * Input.GetAxis("Vertical");
}
if(Drive=="RWD" || Drive=="4WD") {
colliderRL.motorTorque = MaxEngineSpeed * Input.GetAxis("Vertical");
colliderRR.motorTorque = MaxEngineSpeed * Input.GetAxis("Vertical");
}

colliderFR.steerAngle = colliderFL.steerAngle;

ColliderCenterPointFL = colliderFL.transform.TransformPoint(colliderFL.center);
ColliderCenterPointFR = colliderFR.transform.TransformPoint(colliderFR.center);
ColliderCenterPointRL = colliderRL.transform.TransformPoint(colliderRL.center);
ColliderCenterPointRR = colliderRR.transform.TransformPoint(colliderRR.center);

if (Physics.Raycast( ColliderCenterPointFL, -colliderFL.transform.up, hit, colliderFL.suspensionDistance + colliderFL.radius ) ) {
wheelFL.transform.position = hit.point + (colliderFL.transform.up * colliderFL.radius);
}else{
wheelFL.transform.position = ColliderCenterPointFL - (colliderFL.transform.up * colliderFL.suspensionDistance);
}
wheelFL.Rotate(colliderFL.rpm * 6 * Time.deltaTime, 0, 0);

if (Physics.Raycast( ColliderCenterPointFR, -colliderFR.transform.up, hit, colliderFR.suspensionDistance + colliderFR.radius ) ) {
wheelFR.transform.position = hit.point + (colliderFR.transform.up * colliderFR.radius);
}else{
wheelFR.transform.position = ColliderCenterPointFR - (colliderFR.transform.up * colliderFR.suspensionDistance);
}
wheelFR.Rotate(colliderFR.rpm * -6 * Time.deltaTime, 0, 0);

if (Physics.Raycast( ColliderCenterPointRL, -colliderRL.transform.up, hit, colliderRL.suspensionDistance + colliderRL.radius ) ) {
wheelRL.transform.position = hit.point + (colliderRL.transform.up * colliderRL.radius);
}else{
wheelRL.transform.position = ColliderCenterPointRL - (colliderRL.transform.up * colliderRL.suspensionDistance);
}
wheelRL.Rotate(colliderRL.rpm * 6 * Time.deltaTime, 0, 0);

if (Physics.Raycast( ColliderCenterPointRR, -colliderRR.transform.up, hit, colliderRR.suspensionDistance + colliderRR.radius ) ) {
wheelRR.transform.position = hit.point + (colliderRR.transform.up * colliderRR.radius);
}else{
wheelRR.transform.position = ColliderCenterPointRR - (colliderRR.transform.up * colliderRR.suspensionDistance);
}
wheelRR.Rotate(colliderRR.rpm * -6 * Time.deltaTime, 0, 0);

wheelFL.transform.rotation = colliderFL.transform.rotation * Quaternion.Euler(RotationValueFL, colliderFL.steerAngle, 0);
wheelFR.transform.rotation =colliderFR.transform.rotation * Quaternion.Euler(RotationValueFR * -1, colliderFR.steerAngle+180, 0);

RotationValueFL += colliderFL.rpm * ( 360/60 ) * Time.deltaTime;
RotationValueFR += colliderFR.rpm * ( 360/60 ) * Time.deltaTime;

audio.pitch = Mathf.Abs(((colliderFL.rpm + colliderFR.rpm) / 2) / (MaxEngineSpeed * 4)) + 1.0 ;

if ( audio.pitch > 2.0 ) {
audio.pitch = 2.0;
}

}


function OnGUI () {
if(bShowDialog == true) {
windowRect = GUI.Window (0, Rect(5, Screen.height - 145, Screen.width - 10, 140), WindowFunction, "Vehicle Editor");
}
}

function WindowFunction (windowID : int) {
sliderWidth = 80;
margin = 5;
linefeed = 20;
txtwidth = 200;

GUI.Label (Rect (margin, linefeed-5, txtwidth, 30), "Suspension Height: [" + Mathf.Floor(colliderFL.suspensionDistance * 100) / 100 + "]");
colliderFL.suspensionDistance = GUI.HorizontalSlider (Rect (margin + txtwidth+5, linefeed, sliderWidth, 10), colliderFL.suspensionDistance , 0.0, 1.0);
colliderFR.suspensionDistance = colliderFL.suspensionDistance;
colliderRL.suspensionDistance = colliderFL.suspensionDistance;
colliderRR.suspensionDistance = colliderFL.suspensionDistance;
linefeed = linefeed + 20;

GUI.Label (Rect (margin, linefeed-5, txtwidth, 30), "Spring Stiffness: [" + Mathf.Floor(colliderFL.suspensionSpring.spring * 100) / 100 + "]");
colliderFL.suspensionSpring.spring = GUI.HorizontalSlider (Rect (margin + txtwidth+5, linefeed, sliderWidth, 10), colliderFL.suspensionSpring.spring , 2000, 8000);
colliderFR.suspensionSpring.spring = colliderFL.suspensionSpring.spring;
colliderRL.suspensionSpring.spring = colliderFL.suspensionSpring.spring;
colliderRR.suspensionSpring.spring = colliderFL.suspensionSpring.spring;
linefeed = linefeed + 20;

GUI.Label (Rect (margin, linefeed-5, txtwidth, 30), "Spring Damper: [" + Mathf.Floor(colliderFL.suspensionSpring.damper * 100) / 100 + "]");
colliderFL.suspensionSpring.damper = GUI.HorizontalSlider (Rect (margin + txtwidth+5, linefeed, sliderWidth, 10), colliderFL.suspensionSpring.damper , 20.0, 100.0);
colliderFR.suspensionSpring.damper = colliderFL.suspensionSpring.damper;
colliderRL.suspensionSpring.damper = colliderFL.suspensionSpring.damper;
colliderRR.suspensionSpring.damper = colliderFL.suspensionSpring.damper;
linefeed = linefeed + 20;

GUI.Label (Rect (margin, linefeed-5, txtwidth, 30), "Tyre Grip: [" + Mathf.Floor(colliderFL.forwardFriction.stiffness * 100) / 100 + "]");
colliderFL.forwardFriction.stiffness = GUI.HorizontalSlider (Rect (margin + txtwidth+5, linefeed, sliderWidth, 10), colliderFL.forwardFriction.stiffness , 0.01, 1.0);
colliderFR.forwardFriction.stiffness = colliderFL.forwardFriction.stiffness;
colliderRL.forwardFriction.stiffness = colliderFL.forwardFriction.stiffness;
colliderRR.forwardFriction.stiffness = colliderFL.forwardFriction.stiffness;
linefeed = linefeed + 20;

GUI.Label (Rect (margin, linefeed-5, txtwidth, 30), "Tyre Slide/Drift: [" + Mathf.Floor(colliderFL.sidewaysFriction.stiffness * 100) / 100 + "]");
colliderFL.sidewaysFriction.stiffness = GUI.HorizontalSlider (Rect (margin + txtwidth+5, linefeed, sliderWidth, 10), colliderFL.sidewaysFriction.stiffness , 0.1, 0.01);
colliderFR.sidewaysFriction.stiffness = colliderFL.sidewaysFriction.stiffness;
colliderRL.sidewaysFriction.stiffness = colliderFL.sidewaysFriction.stiffness;
colliderRR.sidewaysFriction.stiffness = colliderFL.sidewaysFriction.stiffness;
linefeed = linefeed + 20;

GUI.Label (Rect (margin, linefeed-5, txtwidth, 30), "Centre Of Gravity (Stablity): [" + Mathf.Floor( rigidbody.centerOfMass.y * 100) / 100 + "]");
rigidbody.centerOfMass.y = GUI.HorizontalSlider (Rect (margin + txtwidth+5, linefeed, sliderWidth, 10), rigidbody.centerOfMass.y , -1, -0.1);
linefeed = linefeed + 20;


margin = 300;
linefeed = 20;
txtwidth = 190;

GUI.Label (Rect (margin, linefeed-5, txtwidth, 30), "Maximum Steering Angle: [" + Mathf.Floor( MaxSteeringAngle * 100) / 100 + "]");
MaxSteeringAngle = GUI.HorizontalSlider (Rect (margin + txtwidth+5, linefeed, sliderWidth, 10), MaxSteeringAngle , 5, 60);
linefeed = linefeed + 20;

GUI.Label (Rect (margin, linefeed-5, txtwidth, 30), "Maximum Engine Speed: [" + Mathf.Floor( MaxEngineSpeed * 100) / 100 + "]");
MaxEngineSpeed = GUI.HorizontalSlider (Rect (margin + txtwidth+5, linefeed, sliderWidth, 10), MaxEngineSpeed , 30, 250);
linefeed = linefeed + 20;

GUI.Label (Rect (margin, linefeed-5, txtwidth, 30), "Vehicle Mass: [" + Mathf.Floor( rigidbody.mass * 100) / 100 + "]");
rigidbody.mass = GUI.HorizontalSlider (Rect (margin + txtwidth+5, linefeed, sliderWidth, 10), rigidbody.mass , 1000, 2000);
linefeed = linefeed + 20;

GUI.Label (Rect (margin, linefeed-5, txtwidth, 30), "Vehicle Drag: [" + Mathf.Floor( rigidbody.drag * 100) / 100 + "]");
rigidbody.drag = GUI.HorizontalSlider (Rect (margin + txtwidth+5, linefeed, sliderWidth, 10), rigidbody.drag , 0, 2);
linefeed = linefeed + 20;

if (GUI.Button(Rect(margin, linefeed, 188, 25),"Save Settings...")){
sw = new StreamWriter(Application.dataPath + "\\A-Lab Software RapidUnity Vehicle Resource Pack v1.5\\Vehicle Editor Settings\\AlabCar_" + String.Format("{0:dd-MM-yyyy HH.mm.ss}", System.DateTime.Now) + ".ves");
sw.WriteLine("Rig Type=AlabCar");
sw.WriteLine("Suspension Height=" + colliderFL.suspensionDistance);
sw.WriteLine("Spring Stiffness=" + colliderFL.suspensionSpring.spring);
sw.WriteLine("Spring Damper=" + colliderFL.suspensionSpring.damper);
sw.WriteLine("Tyre Grip=" + colliderFL.forwardFriction.stiffness);
sw.WriteLine("Tyre Slide/Drift=" + colliderFL.sidewaysFriction.stiffness);
sw.WriteLine("Centre Of Gravity (Stablity)=" + rigidbody.centerOfMass.y );
sw.WriteLine("Vehicle Mass=" + rigidbody.mass);
sw.WriteLine("Vehicle Drag=" + rigidbody.drag);
sw.WriteLine("Wheels Collider Radius=" + colliderFL.radius);
sw.Close();
}
}
obi.stas
UNец
 
Сообщения: 1
Зарегистрирован: 19 мар 2013, 18:17

Re: Помогите со скриптом на физику машины

Сообщение seaman 24 мар 2013, 10:18

Примените теги форматирования. Ваш пост не читаем.
seaman
Адепт
 
Сообщения: 8352
Зарегистрирован: 24 янв 2011, 12:32
Откуда: Самара

Re: Помогите со скриптом на физику машины

Сообщение ASD 25 мар 2013, 15:32

Синтаксис:
Используется csharp
public CoM : Gameobject

function Start()
{
    rigidbody.centerOfMass = CoM.localPosition;
}
 


Создаёшь на сцене пустой ГО, переносишь его в объект машины (чтобы он стал дочерним, а машина - родителем), выставляешь туда где тебе нужен центр масс, и перемещаешь его в поле скрипта

з.ы. скрипт - пипец просто :))))
SmartMove Games
ASD
UNIверсал
 
Сообщения: 400
Зарегистрирован: 14 дек 2012, 23:40
Откуда: Харьков
  • ICQ

Re: Помогите со скриптом на физику машины

Сообщение Whity3D 29 апр 2013, 23:32

Всем привет! Дабы не плодить темы напишу тут. Меня тоже интересует скрипт для физики авто, но без использования WeelCollider. Мне не нужен готовый скрипт, объясните в общих чертах куда копать. Быть может есть где-то примеры?
Заранее спасибо!
Whity3D
UNец
 
Сообщения: 4
Зарегистрирован: 19 сен 2011, 09:42

Re: Помогите со скриптом на физику машины

Сообщение nile 29 апр 2013, 23:55

Старая версия jCar не использовала WC.

А чем WC не устроил?

WC - тот же raycast, только для него уже реализованна сила трения и тд.
Аватара пользователя
nile
Старожил
 
Сообщения: 848
Зарегистрирован: 25 фев 2011, 17:17


Вернуться в PhysX

Кто сейчас на конференции

Сейчас этот форум просматривают: нет зарегистрированных пользователей и гости: 2