Я хотел бы понять, как измерить расстояние между двумя трехмерными объектами, давайте назовем их родительским объектом и дочерним объектом.Думайте о родителе как о кузове автомобиля, а ребенок - как о колесе автомобиля.
Я понимаю, как получить разницу, основываясь на положении объектов в мировом пространстве, но я хотел бы получить разницу как измерение, основанное на относительном объектном пространстве родителей.
Например, если родитель смотрит на восток, а ребенок в 2X, 3Y от родителя, измеряется в относительном смысле.Таким образом, если родитель повернется на 60 градусов, относительное местоположение ребенка останется на расстоянии 2x, 3y в пространстве объекта.Где, как и в смысле мирового пространства, измерение дочерних объектов как Vector3 будет совсем другим.
По сути, я просто хочу предсказуемый способ получить разницу, чтобы дочерний объект, который находится справа от патента, всегда мог оставаться справа от родительского объекта.
Это родительский компонент, это обновление запускается каждый кадр:
[Serializable]
public class Component_Parent : BaseComponentAutoSerialization<ISceneEntity>
{
public override void OnUpdate(GameTime gameTime)
{
PassThrough.ParentMatrix = ParentObject.World;
PassThrough.ParentTranslation = ParentObject.World.Translation;
}
}
Следующая часть является дочерним компонентом:
[Serializable]
public class Component_Child : BaseComponentAutoSerialization<ISceneEntity>
{
Vector3 _parentOffset;
Quaternion _parentQuaternionOffset;
public override void OnUpdate(GameTime gameTime)
{
// Get a sceneobject from the ParentObject
SceneObject sceneobject = (SceneObject)ParentObject;
// This relies on the position never being at 0,0,0 for setup, so please don't do that
// or change it with more look ups so that you don't need to rely on a Zero Vector3 :-)
if (PassThrough.GroupSetupMode || _parentOffset == Vector3.Zero)
{
if (PassThrough.ParentTranslation != Vector3.Zero)
{
_parentOffset = sceneobject.World.Translation - PassThrough.ParentTranslation;
// Decompose World Matrix (Parent)
Quaternion parentQ = new Quaternion();
Vector3 parentSpot = new Vector3();
Vector3 parentScale = new Vector3();
PassThrough.ParentMatrix.Decompose(out parentScale, out parentQ, out parentSpot);
Matrix identity = Matrix.Identity;
// Decompose Identity Matrix (Parent)
Quaternion identityQ = new Quaternion();
Vector3 identitySpot = new Vector3();
Vector3 identityScale = new Vector3();
identity.Decompose(out identityScale, out identityQ, out identitySpot);
_parentQuaternionOffset = identityQ - parentQ;
}
}
else
{
if (_parentOffset != Vector3.Zero)
{
// Decompose World Matrix (Child)
Quaternion rotationQ = new Quaternion();
Vector3 spot = new Vector3();
Vector3 scale = new Vector3();
sceneobject.World.Decompose(out scale, out rotationQ, out spot);
// Decompose World Matrix (Parent)
Quaternion parentQ = new Quaternion();
Vector3 parentSpot = new Vector3();
Vector3 parentScale = new Vector3();
PassThrough.ParentMatrix.Decompose(out parentScale, out parentQ, out parentSpot);
Matrix location = Matrix.CreateTranslation(PassThrough.ParentTranslation);
Matrix rotation = Matrix.CreateFromQuaternion(parentQ);
Matrix rotation2 = Matrix.CreateFromQuaternion(_parentQuaternionOffset);
Matrix newWorld = rotation * location;
Vector3 testTranslation = newWorld.Translation + ((newWorld.Left * _parentOffset.X) + (newWorld.Up * _parentOffset.Y) + (newWorld.Forward * _parentOffset.Z));
Matrix scaleM = Matrix.CreateScale(scale);
//sceneobject.World = scaleM * (rotation * (Matrix.CreateTranslation(testTranslation)));
sceneobject.World = (Matrix.CreateTranslation(testTranslation));
}
}
}
}
Я думаю, что у него есть что-тоделать с отслеживанием смещения поворота, из единичной матрицы, и я начал пытаться добавить некоторый код для этого эффекта, но на самом деле не уверен, что дальше.
Дополнительно:
Если яесли родительский объект направлен в направлении мирового пространства, все это работает, если оно направлено в другое направление, то это проблема, и кажется, что дочерний объект поворачивается на ту же величину, когда они группируются вместе.
У меня естьзагрузил демонстрационное видео, чтобы попытаться объяснить:
http://www.youtube.com/watch?v=BzAKW4WBWYs
Я также вставил полный код для компонентов, статического прохода и объекта сцены.
http://pastebin.com/5hEmiVx9
Спасибо