- Home /
Question by
stuart6854 · Aug 13, 2015 at 03:31 PM ·
buoyancy
Make Cube's Volumetric Grid Respond to Rotation
I am currently working on a Buoyancy System(starting with basics) using the suggestion given here: http://answers.unity3d.com/questions/11825/how-can-i-implement-physics-objects-which-float-in.html
I am at the point where i have made a 'Volumetric Grid' and am averaging the positions of the underwater points(Which works), but i have one problem:
It doesn't work with rotations. How can i get the grid to work with rotations(Code Below)?
*EDIT: Also is their a better way for me to create a 'Volumetric Grid'?(would using mesh verticies be better?)
using UnityEngine;
using System.Collections;
using System.Collections.Generic;
public class Buoyancy : MonoBehaviour {
private float WaterLevel;
private VolumePoint[] VolumePoints;//Are points underwater or not?
private Vector3 ObjScale;
private Rigidbody rBody;
private float forceToApply;
private Vector3 PointToApplyForce;
private List<VolumePoint> tempVolumePoints;
void Start() {
ObjScale = transform.localScale;
CreateVolumetricGrid();
}
void Update() {
UpdateVolumetricGrid();
GetForcePoint();
}
void LateUpdate() {
}
void CreateVolumetricGrid() {
tempVolumePoints = new List<VolumePoint>();
for (float z = -ObjScale.z / 2f; z <= ObjScale.z / 2f; z += .25f) {
for (float y = -ObjScale.y / 2f; y <= ObjScale.y / 2f; y += .25f) {
for (float x = -ObjScale.x / 2f; x <= ObjScale.x / 2f; x += .25f) {
tempVolumePoints.Add(new VolumePoint(new Vector3(x, y, z)));
}
}
}
VolumePoints = tempVolumePoints.ToArray();
}
private void UpdateVolumetricGrid() {
foreach (VolumePoint point in VolumePoints) {
if (transform.position.y + point.pointOnObj.y < 0) point.isUnderWater = true;
else point.isUnderWater = false;
}
}
private void GetForcePoint() {
Vector3 Average = new Vector3();
int points = 0;
foreach(VolumePoint point in VolumePoints) {
if (!point.isUnderWater) continue;
Average += point.pointOnObj;
points++;
}
Average /= points;
PointToApplyForce = Average;
}
void OnDrawGizmos() {
Gizmos.color = Color.magenta;
Gizmos.DrawWireCube(transform.position, transform.localScale);
if (VolumePoints == null) return;
foreach (VolumePoint point in VolumePoints) {
if (point.isUnderWater == true) Gizmos.color = Color.green;
else Gizmos.color = Color.red;
Gizmos.DrawCube(transform.position + point.pointOnObj, new Vector3(.01f, .01f, .01f));
}
Gizmos.color = Color.yellow;
if (PointToApplyForce != Vector3.zero) Gizmos.DrawCube(transform.position + PointToApplyForce, new Vector3(.2f, .2f, .2f));
}
}
public class VolumePoint {
public Vector3 pointOnObj;
public bool isUnderWater;
public VolumePoint(Vector3 _pointOnObj) {
this.pointOnObj = _pointOnObj;
}
}
Comment