本文整理汇总了C#中FVector2.Length方法的典型用法代码示例。如果您正苦于以下问题:C# FVector2.Length方法的具体用法?C# FVector2.Length怎么用?C# FVector2.Length使用的例子?那么恭喜您, 这里精选的方法代码示例或许可以为您提供帮助。您也可以进一步了解该方法所在类FVector2
的用法示例。
在下文中一共展示了FVector2.Length方法的5个代码示例,这些例子默认根据受欢迎程度排序。您可以为喜欢或者感觉有用的代码点赞,您的评价将有助于系统推荐出更棒的C#代码示例。
示例1: InitVelocityConstraints
internal override void InitVelocityConstraints(ref SolverData data)
{
_indexA = BodyA.IslandIndex;
_indexB = BodyB.IslandIndex;
_localCenterA = BodyA.Sweep.LocalCenter;
_localCenterB = BodyB.Sweep.LocalCenter;
_invMassA = BodyA.InvMass;
_invMassB = BodyB.InvMass;
_invIA = BodyA.InvI;
_invIB = BodyB.InvI;
FVector2 cA = data.positions[_indexA].c;
float aA = data.positions[_indexA].a;
FVector2 vA = data.velocities[_indexA].v;
float wA = data.velocities[_indexA].w;
FVector2 cB = data.positions[_indexB].c;
float aB = data.positions[_indexB].a;
FVector2 vB = data.velocities[_indexB].v;
float wB = data.velocities[_indexB].w;
Rot qA = new Rot(aA), qB = new Rot(aB);
_rA = MathUtils.Mul(qA, LocalAnchorA - _localCenterA);
_rB = MathUtils.Mul(qB, LocalAnchorB - _localCenterB);
_u = cB + _rB - cA - _rA;
_length = _u.Length();
float C = _length - MaxLength;
if (C > 0.0f)
{
_state = LimitState.AtUpper;
}
else
{
_state = LimitState.Inactive;
}
if (_length > Settings.LinearSlop)
{
_u *= 1.0f / _length;
}
else
{
_u = FVector2.Zero;
_mass = 0.0f;
_impulse = 0.0f;
return;
}
// Compute effective mass.
float crA = MathUtils.Cross(_rA, _u);
float crB = MathUtils.Cross(_rB, _u);
float invMass = _invMassA + _invIA * crA * crA + _invMassB + _invIB * crB * crB;
_mass = invMass != 0.0f ? 1.0f / invMass : 0.0f;
if (Settings.EnableWarmstarting)
{
// Scale the impulse to support a variable time step.
_impulse *= data.step.dtRatio;
FVector2 P = _impulse * _u;
vA -= _invMassA * P;
wA -= _invIA * MathUtils.Cross(_rA, P);
vB += _invMassB * P;
wB += _invIB * MathUtils.Cross(_rB, P);
}
else
{
_impulse = 0.0f;
}
data.velocities[_indexA].v = vA;
data.velocities[_indexA].w = wA;
data.velocities[_indexB].v = vB;
data.velocities[_indexB].w = wB;
}
示例2: SolveVelocityConstraints
internal override void SolveVelocityConstraints(ref SolverData data)
{
FVector2 vB = data.velocities[_indexB].v;
float wB = data.velocities[_indexB].w;
// Cdot = v + cross(w, r)
FVector2 Cdot = vB + MathUtils.Cross(wB, _rB);
FVector2 impulse = MathUtils.Mul(ref _mass, -(Cdot + _C + _gamma * _impulse));
FVector2 oldImpulse = _impulse;
_impulse += impulse;
float maxImpulse = data.step.dt * MaxForce;
if (_impulse.LengthSquared() > maxImpulse * maxImpulse)
{
_impulse *= maxImpulse / _impulse.Length();
}
impulse = _impulse - oldImpulse;
vB += _invMassB * impulse;
wB += _invIB * MathUtils.Cross(_rB, impulse);
data.velocities[_indexB].v = vB;
data.velocities[_indexB].w = wB;
}
示例3: InitVelocityConstraints
internal override void InitVelocityConstraints(ref SolverData data)
{
Body b1 = BodyA;
Body b2 = BodyB;
Transform xf1, xf2;
b1.GetTransform(out xf1);
b2.GetTransform(out xf2);
// Compute the effective mass matrix.
FVector2 r1 = MathUtils.Mul(ref xf1.q, LocalAnchorA - b1.LocalCenter);
FVector2 r2 = MathUtils.Mul(ref xf2.q, LocalAnchorB - b2.LocalCenter);
_u = b2.Sweep.C + r2 - b1.Sweep.C - r1;
// Handle singularity.
float length = _u.Length();
if (length < MaxLength && length > MinLength)
{
return;
}
if (length > Settings.LinearSlop)
{
_u *= 1.0f / length;
}
else
{
_u = FVector2.Zero;
}
float cr1u = MathUtils.Cross(r1, _u);
float cr2u = MathUtils.Cross(r2, _u);
float invMass = b1.InvMass + b1.InvI * cr1u * cr1u + b2.InvMass + b2.InvI * cr2u * cr2u;
Debug.Assert(invMass > Settings.Epsilon);
_mass = invMass != 0.0f ? 1.0f / invMass : 0.0f;
if (Frequency > 0.0f)
{
float C = length - MaxLength;
// Frequency
float omega = 2.0f * Settings.Pi * Frequency;
// Damping coefficient
float d = 2.0f * _mass * DampingRatio * omega;
// Spring stiffness
float k = _mass * omega * omega;
// magic formulas
_gamma = data.step.dt * (d + data.step.dt * k);
_gamma = _gamma != 0.0f ? 1.0f / _gamma : 0.0f;
_bias = C * data.step.dt * k * _gamma;
_mass = invMass + _gamma;
_mass = _mass != 0.0f ? 1.0f / _mass : 0.0f;
}
if (Settings.EnableWarmstarting)
{
// Scale the impulse to support a variable time step.
_impulse *= data.step.dtRatio;
FVector2 P = _impulse * _u;
b1.LinearVelocityInternal -= b1.InvMass * P;
b1.AngularVelocityInternal -= b1.InvI * MathUtils.Cross(r1, P);
b2.LinearVelocityInternal += b2.InvMass * P;
b2.AngularVelocityInternal += b2.InvI * MathUtils.Cross(r2, P);
}
else
{
_impulse = 0.0f;
}
}
示例4: InitVelocityConstraints
internal override void InitVelocityConstraints(ref SolverData data)
{
m_indexA = BodyA.IslandIndex;
m_indexB = BodyB.IslandIndex;
m_localCenterA = BodyA.Sweep.LocalCenter;
m_localCenterB = BodyB.Sweep.LocalCenter;
m_invMassA = BodyA.InvMass;
m_invMassB = BodyB.InvMass;
m_invIA = BodyA.InvI;
m_invIB = BodyB.InvI;
FVector2 cA = data.positions[m_indexA].c;
float aA = data.positions[m_indexA].a;
FVector2 vA = data.velocities[m_indexA].v;
float wA = data.velocities[m_indexA].w;
FVector2 cB = data.positions[m_indexB].c;
float aB = data.positions[m_indexB].a;
FVector2 vB = data.velocities[m_indexB].v;
float wB = data.velocities[m_indexB].w;
Rot qA = new Rot(aA), qB = new Rot(aB);
m_rA = MathUtils.Mul(qA, LocalAnchorA - m_localCenterA);
m_rB = MathUtils.Mul(qB, LocalAnchorB - m_localCenterB);
// Get the pulley axes.
m_uA = cA + m_rA - GroundAnchorA;
m_uB = cB + m_rB - GroundAnchorB;
float lengthA = m_uA.Length();
float lengthB = m_uB.Length();
if (lengthA > 10.0f * Settings.LinearSlop)
{
m_uA *= 1.0f / lengthA;
}
else
{
m_uA = FVector2.Zero;
}
if (lengthB > 10.0f * Settings.LinearSlop)
{
m_uB *= 1.0f / lengthB;
}
else
{
m_uB = FVector2.Zero;
}
// Compute effective mass.
float ruA = MathUtils.Cross(m_rA, m_uA);
float ruB = MathUtils.Cross(m_rB, m_uB);
float mA = m_invMassA + m_invIA * ruA * ruA;
float mB = m_invMassB + m_invIB * ruB * ruB;
m_mass = mA + Ratio * Ratio * mB;
if (m_mass > 0.0f)
{
m_mass = 1.0f / m_mass;
}
if (Settings.EnableWarmstarting)
{
// Scale impulses to support variable time steps.
_impulse *= data.step.dtRatio;
// Warm starting.
FVector2 PA = -(_impulse + _limitImpulse1) * m_uA;
FVector2 PB = (-Ratio * _impulse - _limitImpulse2) * m_uB;
vA += m_invMassA * PA;
wA += m_invIA * MathUtils.Cross(m_rA, PA);
vB += m_invMassB * PB;
wB += m_invIB * MathUtils.Cross(m_rB, PB);
}
else
{
_impulse = 0.0f;
}
data.velocities[m_indexA].v = vA;
data.velocities[m_indexA].w = wA;
data.velocities[m_indexB].v = vB;
data.velocities[m_indexB].w = wB;
}
示例5: InitVelocityConstraints
internal override void InitVelocityConstraints(ref SolverData data)
{
m_indexA = BodyA.IslandIndex;
m_indexB = BodyB.IslandIndex;
m_localCenterA = BodyA.Sweep.LocalCenter;
m_localCenterB = BodyB.Sweep.LocalCenter;
m_invMassA = BodyA.InvMass;
m_invMassB = BodyB.InvMass;
m_invIA = BodyA.InvI;
m_invIB = BodyB.InvI;
FVector2 cA = data.positions[m_indexA].c;
float aA = data.positions[m_indexA].a;
FVector2 vA = data.velocities[m_indexA].v;
float wA = data.velocities[m_indexA].w;
FVector2 cB = data.positions[m_indexB].c;
float aB = data.positions[m_indexB].a;
FVector2 vB = data.velocities[m_indexB].v;
float wB = data.velocities[m_indexB].w;
Rot qA = new Rot(aA), qB = new Rot(aB);
m_rA = MathUtils.Mul(qA, LocalAnchorA - m_localCenterA);
m_rB = MathUtils.Mul(qB, LocalAnchorB - m_localCenterB);
_u = cB + m_rB - cA - m_rA;
// Handle singularity.
float length = _u.Length();
if (length > Settings.LinearSlop)
{
_u *= 1.0f / length;
}
else
{
_u = FVector2.Zero;
}
float crAu = MathUtils.Cross(m_rA, _u);
float crBu = MathUtils.Cross(m_rB, _u);
float invMass = m_invMassA + m_invIA * crAu * crAu + m_invMassB + m_invIB * crBu * crBu;
// Compute the effective mass matrix.
_mass = invMass != 0.0f ? 1.0f / invMass : 0.0f;
if (Frequency > 0.0f)
{
float C = length - Length;
// Frequency
float omega = 2.0f * Settings.Pi * Frequency;
// Damping coefficient
float d = 2.0f * _mass * DampingRatio * omega;
// Spring stiffness
float k = _mass * omega * omega;
// magic formulas
float h = data.step.dt;
_gamma = h * (d + h * k);
_gamma = _gamma != 0.0f ? 1.0f / _gamma : 0.0f;
_bias = C * h * k * _gamma;
invMass += _gamma;
_mass = invMass != 0.0f ? 1.0f / invMass : 0.0f;
}
else
{
_gamma = 0.0f;
_bias = 0.0f;
}
if (Settings.EnableWarmstarting)
{
// Scale the impulse to support a variable time step.
_impulse *= data.step.dtRatio;
FVector2 P = _impulse * _u;
vA -= m_invMassA * P;
wA -= m_invIA * MathUtils.Cross(m_rA, P);
vB += m_invMassB * P;
wB += m_invIB * MathUtils.Cross(m_rB, P);
}
else
{
_impulse = 0.0f;
}
data.velocities[m_indexA].v = vA;
data.velocities[m_indexA].w = wA;
data.velocities[m_indexB].v = vB;
data.velocities[m_indexB].w = wB;
}