Sagging
This commit is contained in:
@ -29,12 +29,32 @@ public class Fractal : MonoBehaviour
|
||||
var parent = parents[i / 5];
|
||||
var part = parts[i];
|
||||
part.spinAngle += spinAngleDelta;
|
||||
part.worldRotation = mul(parent.worldRotation,
|
||||
|
||||
float3 upAxis =
|
||||
mul(mul(parent.worldRotation, part.rotation), up());
|
||||
float3 sagAxis = cross(up(), upAxis);
|
||||
|
||||
float sagMagnitude = length(sagAxis);
|
||||
quaternion baseRotation;
|
||||
if (sagMagnitude > 0f)
|
||||
{
|
||||
sagAxis /= sagMagnitude;
|
||||
quaternion sagRotation =
|
||||
quaternion.AxisAngle(sagAxis, part.maxSagAngle * sagMagnitude);
|
||||
baseRotation = mul(sagRotation, parent.worldRotation);
|
||||
}
|
||||
else
|
||||
{
|
||||
baseRotation = parent.worldRotation;
|
||||
}
|
||||
|
||||
part.worldRotation = mul(baseRotation,
|
||||
mul(part.rotation, quaternion.RotateY(part.spinAngle))
|
||||
);
|
||||
|
||||
part.worldPosition =
|
||||
parent.worldPosition +
|
||||
mul(parent.worldRotation, 1.5f * scale * part.direction);
|
||||
mul(part.worldRotation, float3(0f, 1.5f * scale, 0f));
|
||||
parts[i] = part;
|
||||
|
||||
float3x3 r = float3x3(part.worldRotation) * scale;
|
||||
@ -44,8 +64,9 @@ public class Fractal : MonoBehaviour
|
||||
|
||||
private struct FractalPart
|
||||
{
|
||||
public float3 direction, worldPosition;
|
||||
public float3 worldPosition;
|
||||
public quaternion rotation, worldRotation;
|
||||
public float maxSagAngle;
|
||||
public float spinAngle;
|
||||
}
|
||||
|
||||
@ -77,6 +98,12 @@ public class Fractal : MonoBehaviour
|
||||
[SerializeField]
|
||||
Color leafColorB = default;
|
||||
|
||||
[SerializeField, Range(0f, 90f)]
|
||||
float maxSagAngleA = 15f;
|
||||
|
||||
[SerializeField, Range(0f, 90f)]
|
||||
float maxSagAngleB = 25f;
|
||||
|
||||
static float3[] directions =
|
||||
{
|
||||
up(), right(), left(), forward(), back()
|
||||
@ -93,7 +120,7 @@ public class Fractal : MonoBehaviour
|
||||
{
|
||||
return new FractalPart()
|
||||
{
|
||||
direction = directions[childIndex],
|
||||
maxSagAngle = radians(Random.Range(maxSagAngleA, maxSagAngleB)),
|
||||
rotation = rotations[childIndex]
|
||||
};
|
||||
}
|
||||
|
Reference in New Issue
Block a user