Приведу пример возможной реализации:
Vector3
using System;
namespace Xors3D.OOW
{
public struct Vector3 : IEquatable<Vector3>
{
public float x,y,z;
public override bool Equals(object obj)
{
if (obj is Vector3)
return Equals((Vector3)obj);
else
return false;
}
public bool Equals(Vector3 other)
{
return (this.x == other.x)&&(this.y == other.y)&&(this.y == other.y);
}
public override int GetHashCode()
{
return x.GetHashCode() ^ y.GetHashCode() ^ z.GetHashCode() ;
}
public static bool operator ==(Vector3 left, Vector3 right)
{
return left.Equals(right);
}
public static bool operator !=(Vector3 left, Vector3 right)
{
return !left.Equals(right);
}
}
}
Object
using System;
using System.Collections.Generic;
using X3D = Xors3DDotNET.Xors3D;
namespace Xors3D.OOW
{
public abstract class Object:IDisposable
{
public readonly int refLink;
public Object(int objRefLink)
{
refLink = objRefLink;
}
public abstract void Dispose();
}
}
Entity
using System;
using X3D = Xors3DDotNET.Xors3D;
namespace Xors3D.OOW
{
public abstract class Entity:Object
{
protected Entity(int objRefLink):base(objRefLink)
{
}
public void SetPosition (float x, float y, float z)
{
X3D.xPositionEntity(this.refLink, x, y, z);
}
public void SetPosition (Vector3 v)
{
X3D.xPositionEntity(this.refLink, v.x, v.y, v.z);
}
public void SetGlobalPosition (float x, float y, float z)
{
X3D.xPositionEntity(this.refLink, x, y, z, 1);
}
public void SetGlobalPosition (Vector3 v)
{
X3D.xPositionEntity(this.refLink, v.x, v.y, v.z, 1);
}
public void SetRotation (float x, float y, float z)
{
X3D.xPositionEntity(this.refLink, x, y, z);
}
public void SetRotation (Vector3 v)
{
X3D.xRotateEntity(this.refLink, v.x, v.y, v.z);
}
public void SetGlobalRotation (float x, float y, float z)
{
X3D.xRotateEntity(this.refLink, x, y, z, 1);
}
public void SetGlobalRotation (Vector3 v)
{
X3D.xRotateEntity(this.refLink, v.x, v.y, v.z, 1);
}
public Vector3 GetPosition()
{
Vector3 v = new Vector3();
v.x = X3D.xEntityX(this.refLink, 0);
v.y = X3D.xEntityY(this.refLink, 0);
v.z = X3D.xEntityZ(this.refLink, 0);
return v;
}
public Vector3 GetGlobalPosition()
{
Vector3 v = new Vector3();
v.x = X3D.xEntityX(this.refLink, 1);
v.y = X3D.xEntityY(this.refLink, 1);
v.z = X3D.xEntityZ(this.refLink, 1);
return v;
}
public Vector3 GetRotation()
{
Vector3 v = new Vector3();
v.x = X3D.xEntityPitch(this.refLink, 0);
v.y = X3D.xEntityYaw(this.refLink, 0);
v.z = X3D.xEntityRoll(this.refLink, 0);
return v;
}
public Vector3 GetGlobalRotation()
{
Vector3 v = new Vector3();
v.x = X3D.xEntityPitch(this.refLink, 1);
v.y = X3D.xEntityYaw(this.refLink, 1);
v.z = X3D.xEntityRoll(this.refLink, 1);
return v;
}
public void SetParent (Entity parent)
{
if (parent != null)
{
X3D.xEntityParent(this.refLink, parent.refLink);
}
else
{
X3D.xEntityParent(this.refLink, 0);
}
}
}
}
Pivot
using System;
using X3D = Xors3DDotNET.Xors3D;
namespace Xors3D.OOW
{
public class Pivot:Entity
{
public Pivot():base(X3D.xCreatePivot())
{
}
public Pivot(Entity parent):base(X3D.xCreatePivot(parent.refLink))
{
}
public override void Dispose()
{
X3D.xFreeEntity(this.refLink);
}
}
}