Форумы Homeworld3.RU

Форумы Homeworld3.RU (http://www.homeworld3.ru/forum/index.php)
-   Игры мечты (http://www.homeworld3.ru/forum/forumdisplay.php?f=44)
-   -   Внутри корабля (http://www.homeworld3.ru/forum/showthread.php?t=2080)

KUPRUM 03-30-2011 08:12 PM

Re: Внутри корабля
 
Все будит - и ствол и жизнь, дайте времени вагон)))

KUPRUM 04-11-2011 11:30 AM

Re: Внутри корабля
 
Отсюда я беру идеи по оборудованию корвета:

Военное-дело -- Корабли-будущего

Военное-дело -- Эсминцы

Джаспер 04-11-2011 01:58 PM

Re: Внутри корабля
 
Интересный материал. Правда в роликах почти не упоминался внутренний дизайн кораблей, за исключением нескольких сравнительно коротких кадров.

P.S. Музыка в роликах взята из C&C3. :)

KUPRUM 04-11-2011 02:50 PM

Re: Внутри корабля
 
Да сори нужно уточнить, идея того что внутри корвета могут быть шаттлы это аналог того, что на современном судне есть вертолеты. Плюс круговой радар на американском дестроере.

Никогда не задумывался над музыкой :)

Вот новый обзор. Это конечно еще не ИИ, но и не чистая анимация. Два манипулятора определяют место положения очередного блока, смещается к нему и запускает ответствующие анимации. В полном корабле отключения блоков компьютера будит влиять на работоспособность систем управляемых теми или иными блоками.
ссылка для стачивания 12.rar
пароль: KUPRUM 2

Управление то же,
Как и прежде понадобится вивер - вот ссылка: Viewer.rar, пароль: viewer

Управление:
Передвижение так же и осталось при помощи стрелочек.
LShift - фиксация курсора
зажатая ЛКМ - вращение камеры
щелчке ЛКМ иногда и ПКМ - кнопки действия
F12 - рестарт сцены
Пробел - ускорение в 3 раза
R - скринсшот
ESC - выход из программы

Под конец загрузки прога долго стоит, но потом все равно погружается - пока не знаю с чем это связано, постараюсь убрать в дальнейшем.

Джаспер 04-12-2011 04:20 PM

Re: Внутри корабля
 
Неплохо. Надо будет тебе космосимулятор делать. :)

Да не просто симулятор, а с элементами шутера при абордаже! :shotgun: :sniper: :guns: :cruiser:

P.S. :lol:

KUPRUM 04-12-2011 04:27 PM

Re: Внутри корабля
 
А кто сказал, что я не делаю :laugh:

KUPRUM 04-14-2011 08:06 PM

Re: Внутри корабля
 
Ребят кто знает математику - помогите.
Необходима формула коррекции угла направленности вектора.

Нашел следующий пример:



Dy1,dx1, dy2,dx2 – координаты объектов на плоскости. Вроде как определяем координаты гипотенузы.
dx=(dx1-dx2)
dy=(dy1-dy2)
Рассчитываем поправку
Y=atan(dy/dx)
Вот дальше я совсем не понимаю что это
x2<x1 and y2>y1 Quad=0
x2<x1 and y2<y1 Quad=0
x2>x1 and y2<y1 Quad=pi
x2>x1 and y2>y1 Quad=pi

Проблемам в том, что это только для оси Z, а как его адаптировать для других осей без понятия уже. Или подскажите где взять такую теорему.

Agronom 04-14-2011 09:09 PM

Re: Внутри корабля
 
Ничего не понял.
Какая коррекция нужна? Какого конкретно угла?

p.s. В чём заключается задача? Может подскажу решение.

KUPRUM 04-14-2011 09:15 PM

Re: Внутри корабля
 
Есть два объекта - объект один это цель, объект два это ну пусть ракета, как определить куда должна лететь ракета что бы попасть в цель. Приведенная выписка формул мне встречается уже дважды, в учебнике по action script, и в примерах по esp creator. Проблемам в том, что эти формулы работают только для оси z.

Agronom 04-14-2011 09:20 PM

Re: Внутри корабля
 
Я так понимаю, нужно плавно повернуть 3-мерный вектор к цели?

KUPRUM 04-14-2011 09:22 PM

Re: Внутри корабля
 
Да хотя бы просто выяснить сколько и куда поворачивать, а дальше как нибудь сам))))

Agronom 04-14-2011 09:48 PM

Re: Внутри корабля
 
Я бы посоветовал, для наилучшего результата:
  1. Преобразовать векторы в кватернионы: http://www.rossprogrammproduct.com/t...%20FAQ.htm#Q56
  2. Произвести сферическую линейную интерполяцию (slerp): http://wat.gamedev.ru/articles/quate...nterpolyatsiya
  3. Получить обратно вектор: http://www.rossprogrammproduct.com/t...%20FAQ.htm#Q57
    Или матрицу вращения: http://www.rossprogrammproduct.com/t...%20FAQ.htm#Q54
ИМХО ещё лучше хранить ориентацию сразу в кватернионах, т.к. у них не бывает "Gimbal lock": http://www.rossprogrammproduct.com/t...%20FAQ.htm#Q34

KUPRUM 04-14-2011 10:03 PM

Re: Внутри корабля
 
Спасибо, я опробую в этом разобраться, а представленные выше формулы тебе не знакомы? Там очень простой алгоритм с их применением выходит.

Как читается вот такое выражение p1[2] = p->z; ? ну то есть что значит знак ">" в нем? Это из "Произвести сферическую линейную интерполяцию (slerp)".

Agronom 04-14-2011 10:27 PM

Re: Внутри корабля
 
Quote:

Originally Posted by KUPRUM (Post 44440)
а представление выше формулы тебе не знакомы?

Нет. Я не понял для чего нужны эти вычисления.
Такое ощущение, что это обрывки всего алгоритма.

Может быть достаточно, в этом случае, простой интерполяции векторов.
Но с кватернионами поворот происходит по кратчайшей дуге, с учетом вращения вокруг оси.

Добавлено через 12 минут
Quote:

Originally Posted by KUPRUM (Post 44440)
Как читается вот такое выражение p1[2] = p->z; ?

Считай написано: "p1[2] = p.z".

"->" - это оператор для косвенного доступа к переменным и методам объекта в C++.
То есть:
Если "p" - объект, то получить "z" можно так: "p.z".
А если указатель на него, то так: "p->z".

KUPRUM 04-14-2011 10:40 PM

Re: Внутри корабля
 
Это чисто формулы, пример полного алгоритма такой (это Common Lisp)

Code:

(setq  Xbase (nth 0(getobjectlocation Follower 1))) ; Позиция объекта который будит двигается за курсором
(setq  Ybase (nth 1(getobjectlocation Follower 1)))


        (setobjectlocation "CamTracker" Xbase Ybase 0) ; это фиксация камеры


получение положения курсора в пиксилях
Code:

        (setq x (nth 0 (getcursorpos)))
        (setq y (nth 1 (getcursorpos)))


Ниже различные варианты проигрывания анимации, в зависимости от условий
Code:

        (if (/= (pickobjectatpoint x y ) MeshName)(progn
                (animationonoff FollowerControls Run 1 2)
                (triggeranimation Leader "Set as Cursor01") ; use cheese wedge as cursor
                (objectshowhide Leader 0)
                )
                (progn
                (animationonoff FollowerControls Stand 1 2)
                (triggeranimation Leader "Set as Cursor01" 1)  ; stop cheese wedge as cursor
                (objectshowhide Leader 1)
                )
        )


Получаем координаты куда кликнул пользователь
Code:

        (setq worldPoint  (pickpointonplane x y '( 0 0 1 0)))
Считываем эти координаты в переменные
Code:

        (setq Xpos1 (nth 0 worldPoint)) ; cursor position
        (setq Ypos1 (nth 1 worldPoint))
        ;we know z is 0

Здесь какой то объект переносится в точку куда щелкнул пользователь
Code:

        (setobjectlocation Leader Xpos1 Ypos1 0) ; set cursor position object
вот определении координат вектора где Xpos1 Ypos1 координаты щелчка
Code:

Xbase Ybase координаты следящего объекта
        (setq Xvector1 (- Xpos1 Xbase)) ; get vector displacement using the planar position with base point (0,0)
        (setq Yvector1 (- Ypos1 Ybase)) ;

Определении между ними дистанции
Code:

        (setq mag1 (sqrt (+ (pow Xvector1 2)(pow Yvector1 2)))) ; get magnatude/length of vector
ну это движение объекта в зависимости от его удаления от места щелчка
Code:

        (if (< mag1 12) ;if teapot is getting close to the cursor, slow it down (using the distance + 2), else keep it fast
                (setanimationvarbydesc Follower "Object Key Move01" "X Dist Per Sec" (+ mag1 2))
                (setanimationvarbydesc Follower "Object Key Move01" "X Dist Per Sec" 12)
        )

вот вычисление угла поправки, результат в радианах
Code:

        (setq dir (atan (/ Yvector1 Xvector1))) ; get direction in radians


        ; figure out which quadrant it's in to correct direction in radians

вот тут не понятно, это что вроде в какую четверть попадает точка но черт его знает
Code:

        (if (and (< Xbase Xpos1)(> Ybase Ypos1))(progn
                ;(princ "quad 1\n")
                (setq Quad 0)
                )
        ) ; quad1
        (if (and (< Xbase Xpos1)(< Ybase Ypos1))(progn
                ;(princ "quad 4\n")
                (setq Quad 0)
                )
        ); quad 4
        (if (and (> Xbase Xpos1)(< Ybase Ypos1))(progn
                ;(princ "quad 3\n")
                (setq Quad pi)
                )
        ) ; quad 3
        (if (and (> Xbase Xpos1)(> Ybase Ypos1))(progn
                ;(princ "quad 2\n")
                (setq Quad pi)
                )
        ); quad 2

вот собственно окончательная поправка
Code:

(setq CorrectedRadian (+ quad dir))

; try to slow rotation when too close


это замедление ротации, но почему то оно отключено
Code:

;(if (and (< mag1 3)(> mag1 1.5))(setq CorrectedRadian (min (abs(+ OldRadian 1)) (abs CorrectedRadian))))
Вот собственно сама функция ротации
Code:

(setobjectrotation Leader 0 0 CorrectedRadian)
(setobjectrotation Follower 0 0 CorrectedRadian)

сохраняем предыдущий результат.
Code:

(setq OldRadian CorrectedRadian)
конец кода
Code:

(exit T)
Вот собственно сам пример работы этого алгоритма могу написать пример с этими формулами на акшон скрипте в флэш

\\__________________________________________________________________________

То есть z это внешняя переменная?
Я знаком с C# а вот до C++ никак руки не доходят.

Спасибо за помощь? попробую разобраться на выходных с этими алгоритмами))))

Agronom 04-14-2011 10:58 PM

Re: Внутри корабля
 
Quote:

Originally Posted by KUPRUM (Post 44443)
То есть z это внешняя переменная?

Это компонента кватерниона "p".
Code:

struct Quaternion
{
    float x, y, z, w;
};

Просто доступ косвенный:
Code:

Quaternion a; // объект класса Quaternion
Quaternion *p = &a; // указатель на объект "a" (его адрес в памяти)
// a.z == p->z


KUPRUM 04-14-2011 11:02 PM

Re: Внутри корабля
 
М да придется поломать мозги, кажется понял. Меня всегда напрягало что в си нет глобальных переменных. Quaternion это выходит список или это целая функция?

А это как понимать? Quaternion * p отсюда это умножение?

Code:

void Slerp(Quaternion * res, Quaternion * q, Quaternion * p, float t)

Agronom 04-14-2011 11:16 PM

Re: Внутри корабля
 
Quote:

Originally Posted by KUPRUM (Post 44445)
в си нет глобальных переменных.

Как это - нет? :apchhi: Может в C#? :D
Quaternion - это структура (в C++ - класс, где всё по умолчанию public).

KUPRUM 04-14-2011 11:20 PM

Re: Внутри корабля
 
Не, там тоже нет. Глобальные переменные есть в делфи, а в лисп они все глобальные.

Способы ссылки на переменные в C# аналогичен C++

Плохо что класс - значит оно мне тем более не канает. Не разрабатывать же его отдельно на лисп :confused:

Agronom 04-14-2011 11:23 PM

Re: Внутри корабля
 
Quote:

Originally Posted by KUPRUM (Post 44445)
А это как понимать? Quaternion * p отсюда это умножение?

Code:

void Slerp(Quaternion * res, Quaternion * q, Quaternion * p, float t)

Нет.
res - указатель (переменная, где хранится адрес кватерниона).

В C# будет что-то типа:
public static void Slerp(out Quaternion res, Quaternion q, Quaternion p, float t);


All times are GMT +3. The time now is 11:37 AM.