Rolling Rolling в DirectX с C # - PullRequest
       58

Rolling Rolling в DirectX с C #

1 голос
/ 08 июня 2011

Я пытаюсь создать качели с шариком на форме, который на основе угла формы вращается.

Вот скриншот этого.

enter image description here

Итак, форма качелей перемещается в зависимости от угла, генерируемого значением трекбара.

Вот объявленные переменные:

private const float ONE_DEGREE = 0.0174532924f;
        private ID3DMesh tab;        
        private ID3DMesh ball;

Переменная 'tab' - это форма.

Этот метод устанавливает угол формы:

public void setShapeAngle(float degree)
{            
    tabTargetAngle = Util.DegreeToRadian(degree);
}

А вот метод, который обновляет его:

public void Update(int elapsedTime)
        {

            if (tab.Pitch != tabTargetAngle)
            {
                if (tabTargetAngle > tab.Pitch)
                {
                    if (tab.Pitch >= (tabTargetAngle - ONE_DEGREE))
                    {
                        tab.Pitch = tabTargetAngle;

                    }
                    else
                    {
                        tab.Pitch += tabuaSpeed * elapsedTime;                        
                    }
                }
                else if (tabTargetAngle < tab.Pitch)
                {
                    if (tab.Pitch <= (tabTargetAngle + ONE_DEGREE))
                    {
                        tab.Pitch = tabTargetAngle;

                    }
                    else
                    {
                        tab.Pitch -= tabuaSpeed * elapsedTime;                        

                    }

                }

            }                                                 
        }

Все объекты являются объектами ID3DMesh.Вот код класса ID3DMesh.

 public interface ID3DMesh : IDisposable
    {
        Color Ambient { get; set; }
        CollisionTestMethod CollisionDetectionMethod { get; set; }
        Mesh D3DXMesh { get; }
        Color Diffuse { get; set; }
        Color Emissive { get; set; }
        Material[] Materials { get; set; }
        ID3DMesh Parent { get; set; }
        float Pitch { get; set; }
        Vector3 PivotOffset { get; set; }
        float PivotOffsetX { get; set; }
        float PivotOffsetY { get; set; }
        float PivotOffsetZ { get; set; }
        Vector3 Position { get; set; }
        RenderOptions RenderSettings { get; set; }
        float Roll { get; set; }
        Vector3 Scale { get; set; }
        float ScaleX { get; set; }
        float ScaleY { get; set; }
        float ScaleZ { get; set; }
        Color Specular { get; set; }
        float SpecularSharpness { get; set; }
        Texture[] Textures { get; set; }
        Color WireColor { get; set; }
        float X { get; set; }
        float Y { get; set; }
        float Yaw { get; set; }
        float Z { get; set; }

        MeshBoundingBox GetBoundingBox();
        MeshBoundingSphere GetBoundingSphere();
        float GetDepth();
        float GetHeight();
        float GetWidth();
        Matrix GetWorldMatrix();
        bool Intersects(ID3DMesh mesh);
        void Link(ID3DMesh parentMesh, Vector3 linkPosition);
        void Move(float xAmount, float yAmount, float zAmount);
        void Render();
        void RenderPlanarShadow(Plane groundPlane, Light light, bool allowDoubleBlending);
        void SetDepth(float depth);
        void SetDepth(float depth, bool uniformScale);
        void SetHeight(float height);
        void SetHeight(float height, bool uniformScale);
        void SetPlanarShadowOpacity(float shadowOpacity);
        void SetScale(float amount);
        void SetScale(float xAmount, float yAmount, float zAmount);
        void SetSize(float width, float height, float depth);
        void SetWidth(float width);
        void SetWidth(float width, bool uniformScale);
    }

Я пытался использовать метод Move (float, float, float).Но он не сдвинулся с места.Если бы вы могли помочь мне с этим.

Спасибо.

Ответы [ 2 ]

2 голосов
/ 13 июня 2011

(Примечание: ниже я буду игнорировать третье измерение, потому что шар всегда будет двигаться в одной плоскости)

Если мы возьмем качели в качестве системы отсчета, я думаю, что движение шара будет аналогично движению гармонического осциллятора . То есть положение мяча вдоль качелей в данный момент времени s (t) будет определяться следующей формулой:

s (t) = L cos (2π t / T + ϕ)

где L - длина качелей (амплитуда гармоники), а T - время, необходимое шарику для перемещения от одного конца качелей к другому и обратно к началу (период гармоники) , ϕ, начальная фаза гармоники, предназначена для настройки формулы, поэтому s (0) дает вам начальную позицию. Если вы хотите, чтобы он начинался в центре, вам нужно сделать s (0) = 0, что означает, что вам нужно, чтобы косинус был равен 0. Таким образом, вы должны сделать ϕ равным π / 2 (90 градусов), потому что cos (π / 2) = 0.

С этим вы можете поставить мяч на место, изменив трансформацию мира. Если вы поворачиваете его на текущий угол качелей (назовем его θ (t)), вы можете просто перевести шар на значение s (t) вдоль оси xx.

Это эквивалентно обработке (s (t), θ (t)) как положения шара в полярных координатах. Затем вы можете получить декартовы координаты в данный момент времени (x (t), y (t)) с помощью следующих формул:

x (t) = s (t) cos (θ)

y (t) = s (t) sin (θ)

1 голос
/ 09 июня 2011

(Предположим, что вектор вверх равен (0, 1, 0), а вкладка выровнена по оси X)

Вы можете представить, что шар должен будет «скатиться» вниз по вкладке вдольось X, и вам нужно будет рассчитать Y-позицию, чтобы позволить ей придерживаться вкладки.

Вы можете использовать метод Move() для позиции X, так как скорость мяча влияет на его позицию X относительно.

Хотя Y-позиция (пока мяч остается на вкладке) может быть легче вычислена для каждой X-позиции, установив свойство Y.

Если бы я был на вашем месте, я бы начал с создания метода, который вычисляет позицию Y, чтобы шар "прилипал к язычку" для любой позиции X.

Если это не указываетВы в правильном направлении, пожалуйста, уточните немного о том, что «оно не сдвинулось с места».

...