修改水
This commit is contained in:
@@ -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);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user