修改水

This commit is contained in:
2026-01-01 22:00:33 +08:00
parent 040a222bd6
commit 9ceffccd39
1800 changed files with 103929 additions and 139495 deletions

View File

@@ -23,8 +23,6 @@ namespace Obi
private NativeArray<float4x4> linearTransforms;
private NativeArray<float4x4> plasticDeformations;
private bool m_RecalculateRestShape = false;
public BurstShapeMatchingConstraintsBatch(BurstShapeMatchingConstraints constraints)
{
m_Constraints = constraints;
@@ -69,37 +67,13 @@ namespace Obi
Aqq.Dispose();
}
public override JobHandle Initialize(JobHandle inputDeps, float stepTime, float substepTime, int steps, float timeLeft)
public override JobHandle Initialize(JobHandle inputDeps, float substepTime)
{
return inputDeps;
}
public override JobHandle Evaluate(JobHandle inputDeps, float stepTime, float substepTime, int steps, float timeLeft)
public override JobHandle Evaluate(JobHandle inputDeps, float stepTime, float substepTime, int substeps)
{
if (m_RecalculateRestShape)
{
m_RecalculateRestShape = false;
var calculateRest = new ShapeMatchingCalculateRestJob()
{
particleIndices = particleIndices,
firstIndex = firstIndex,
numIndices = numIndices,
restComs = restComs,
coms = coms,
Aqq = Aqq,
deformation = plasticDeformations,
restPositions = solverAbstraction.restPositions.AsNativeArray<float4>(),
restOrientations = solverAbstraction.restOrientations.AsNativeArray<quaternion>(),
principalRadii = solverAbstraction.principalRadii.AsNativeArray<float4>(),
invMasses = solverAbstraction.invMasses.AsNativeArray<float>(),
invRotationalMasses = solverAbstraction.invRotationalMasses.AsNativeArray<float>(),
};
inputDeps = calculateRest.Schedule(numIndices.Length, 64, inputDeps);
}
var projectConstraints = new ShapeMatchingConstraintsBatchJob()
{
particleIndices = particleIndices,
@@ -120,7 +94,7 @@ namespace Obi
restOrientations = solverImplementation.restOrientations,
invMasses = solverImplementation.invMasses,
invRotationalMasses = solverImplementation.invRotationalMasses,
principalRadii = solverImplementation.principalRadii,
invInertiaTensors = solverImplementation.invInertiaTensors,
deltas = solverImplementation.positionDeltas,
counts = solverImplementation.positionConstraintCounts,
@@ -153,7 +127,25 @@ namespace Obi
public void CalculateRestShapeMatching()
{
m_RecalculateRestShape = true;
var deps = ((BurstSolverImpl)constraints.solver).RecalculateInertiaTensors(new JobHandle());
var calculateRest = new ShapeMatchingCalculateRestJob()
{
particleIndices = particleIndices,
firstIndex = firstIndex,
numIndices = numIndices,
restComs = restComs,
coms = coms,
Aqq = Aqq,
deformation = plasticDeformations,
restPositions = solverAbstraction.restPositions.AsNativeArray<float4>(),
restOrientations = solverAbstraction.restOrientations.AsNativeArray<quaternion>(),
invMasses = solverAbstraction.invMasses.AsNativeArray<float>(),
invInertiaTensors = solverAbstraction.invInertiaTensors.AsNativeArray<float4>(),
};
calculateRest.Schedule(numIndices.Length, 64, deps).Complete();
}
protected static void RecalculateRestData(int i,
@@ -164,10 +156,9 @@ namespace Obi
ref NativeArray<float4x4> deformation,
ref NativeArray<int> numIndices,
ref NativeArray<float> invMasses,
ref NativeArray<float> invRotationalMasses,
ref NativeArray<float4> restPositions,
ref NativeArray<quaternion> restOrientations,
ref NativeArray<float4> principalRadii)
ref NativeArray<float4> invInertiaTensors)
{
int k = 0;
float maximumMass = 10000;
@@ -194,7 +185,7 @@ namespace Obi
particleR[3][3] = 0;
_Rqq += math.mul(particleR,
math.mul(BurstMath.GetParticleInertiaTensor(principalRadii[k], invRotationalMasses[k]).asDiagonal(),
math.mul(math.rcp(invInertiaTensors[k] + new float4(BurstMath.epsilon)).asDiagonal(),
math.transpose(particleR))
);
@@ -234,8 +225,7 @@ namespace Obi
[ReadOnly] public NativeArray<float4> restPositions;
[ReadOnly] public NativeArray<quaternion> restOrientations;
[ReadOnly] public NativeArray<float> invMasses;
[ReadOnly] public NativeArray<float> invRotationalMasses;
[ReadOnly] public NativeArray<float4> principalRadii;
[ReadOnly] public NativeArray<float4> invInertiaTensors;
public void Execute(int i)
{
@@ -247,10 +237,9 @@ namespace Obi
ref deformation,
ref numIndices,
ref invMasses,
ref invRotationalMasses,
ref restPositions,
ref restOrientations,
ref principalRadii);
ref invInertiaTensors);
}
}
@@ -276,7 +265,7 @@ namespace Obi
[ReadOnly] public NativeArray<quaternion> restOrientations;
[ReadOnly] public NativeArray<float> invMasses;
[ReadOnly] public NativeArray<float> invRotationalMasses;
[ReadOnly] public NativeArray<float4> principalRadii;
[ReadOnly] public NativeArray<float4> invInertiaTensors;
[NativeDisableContainerSafetyRestriction][NativeDisableParallelForRestriction] public NativeArray<quaternion> orientations;
[NativeDisableContainerSafetyRestriction][NativeDisableParallelForRestriction] public NativeArray<float4> deltas;
@@ -309,7 +298,7 @@ namespace Obi
particleRT[3][3] = 0;
Rpq += math.mul(particleR,
math.mul(BurstMath.GetParticleInertiaTensor(principalRadii[k], invRotationalMasses[k]).asDiagonal(),
math.mul(math.rcp(invInertiaTensors[k] + new float4(BurstMath.epsilon)).asDiagonal(),
math.transpose(particleRT))
);
@@ -338,7 +327,7 @@ namespace Obi
linearTransforms[i] = math.mul(Apq_def, Aqq[i]);
// extract rotation from transform matrix, using warmstarting and few iterations:
constraintOrientations[i] = BurstMath.ExtractRotation(Apq_def, constraintOrientations[i], 5);
constraintOrientations[i] = BurstMath.ExtractRotation(Apq_def, constraintOrientations[i], 2);
// finally, obtain rotation matrix:
float4x4 R = constraintOrientations[i].toMatrix();
@@ -411,10 +400,9 @@ namespace Obi
ref deformation,
ref numIndices,
ref invMasses,
ref invRotationalMasses,
ref restPositions,
ref restOrientations,
ref principalRadii);
ref invInertiaTensors);
}
}
@@ -430,10 +418,9 @@ namespace Obi
ref deformation,
ref numIndices,
ref invMasses,
ref invRotationalMasses,
ref restPositions,
ref restOrientations,
ref principalRadii);
ref invInertiaTensors);
}
}
}