Программирование игр, создание игрового движка, OpenGL, DirectX, физика, форум
GameDev.ru / Программирование / Форум / GLSL костная анимация, сделать так что бы руки игрока всегда смотрели как камера от первого лица.

GLSL костная анимация, сделать так что бы руки игрока всегда смотрели как камера от первого лица.

Страницы: 1 2 3 Следующая »
ronnikoПостоялецwww10 окт. 20188:56#0
Делаю шутер от первого лица.
Есть анимированые руки игрока.
Хочу что бы при повороте камеры руки тоже поворачивались вслед за камерой. То есть привязать к камере.

Ну в общем как в Сталкере руки игрока.

Проблема в том что когда я умножаю на матрицу View , при взгляде вверх или вниз руки пропадают или искажаются.
Что выглядит не красиво и не верно.

Если не умножаю на View анимацию то руки стоят на месте и не привязаны к камере. Но анимация и модель выглядят нормально.


PS: Если кто делал на GLSL вершинном шейдере такое, то подскажите как умножали анимированные вершины на матрицу камеры.

Правка: 10 окт. 2018 8:58

Polyflow3dПостоялецwww10 окт. 20189:23#1
сделай руки и камеру статичными, а двигай вокруг домики и монстров. Получится зашибись.
g-contПостоялецwww10 окт. 201811:00#2
Руки обычно копируют позицию и углы камеры
ronnikoПостоялецwww10 окт. 201811:15#3
GLSL обычно не обычно делается в отличии от HLSL.
Потому и спросил.
Я долго сидел на HLSL а вот теперь стал писать под GLSL
И вижу что есть нюансы в GLSL.

Например 1-я проблема в GLSL.
Если я input.Pos сетки умножу на матрицу Projection то я вижу статические руки героя и они привязаны к камере.
То есть то что надо.

Но вот если применяю к input.Pos сетки матрицы и веса анимации , а потом результат умножаю на Projection матрицу
То нет на экране рук.

Зато если умножаю на Projection * View * AnimResult то вижу анимированные руки героя , но они стоят в одной точке уровня и не привязаны к камере.

Правка: 10 окт. 2018 11:37

f1ufx_Забаненwww10 окт. 201813:08#4
Перед рендером рук, выставляй в плюсах другую матрицу вида.
Т.е. мир рисуем одной матрицей вида, а руки - другой.
А шейдер на всё - один и тот же.
Иными словами, перед отрисовкой рук меняй соответствуюм образом положение камеры. Ресетни у камеры вращение например.
vindastПостоялецwww10 окт. 201814:40#5
ronniko
> то подскажите как умножали анимированные вершины на матрицу камеры.
Брали и умножали?

ronniko
> Проблема в том что когда я умножаю на матрицу View , при взгляде вверх или вниз
> руки пропадают или искажаются.
> Что выглядит не красиво и не верно.

У камеры есть вектор вперед (Z) и вектор вверх (Y) - это особенно заметно если юзаешь  glm.
Находишь вектор X = cross(Y, Z),

Нормализированная тройка этих векторов это базис камеры в мировых координатах, она же матрица модели. Еще у камеры есть центр проекции, нужно сместить кватернион туда же, пусть будет P.  Все.

M = (X, Y, Z) - порядок ручками подберешь по тому что я не знаю какие у тебя анимации.

Q = proj * view * P * M * (анимация или что там у тебя)

Правка: 10 окт. 2018 14:45

ronnikoПостоялецwww11 окт. 20189:48#6
Сделал но фигово.

Есть две проблемы.
Когда смотрю вверх или вниз руки уходят вверх или вниз.
И вторая на видео видно когда вращаюсь влево или вправо руки исчизают\обрезаются.

Правка: 11 окт. 2018 9:50

ronnikoПостоялецwww11 окт. 20189:53#7
Вот как сейчас делаю в вершинном шейдере. Матрицы под левостороннюю систему.
#version 450
layout(location = 0) in vec3 vPosition;
layout(location = 3) in vec4 Bones;
layout(location = 4) in vec4 Wes;
layout (binding = 2, std430) buffer AnimKeys { mat4 Kadr[]; };//Это матрици-кости AnimationKeys
 
vec2 ar = vec2(10,5);//это номер кадра анимации и число костей для данной сетки
mat4 K1 = mat4(Kadr[uint(Bones.x-1+ar.x*ar.y)]);
mat4 K2 = mat4(Kadr[uint(Bones.y-1+ar.x*ar.y)]);
vec4 poz =  K1 * vec4(vPosition.xyz * Wes.x , 1.0* Wes.x);
     poz += K2 * vec4(vPosition.xyz * Wes.y , 1.0* Wes.y);

//vec3 PosXYZ передаю с CPU это позиция камеры в 3д мире.
mat4 PP = mat4(1,0,0,0, 0,1,0.18,0, 0,0,-1,-0.0, PosXYZ.xyz,1);
vec4 tt = ViewProj *  ( PP  * vec4(poz.xyz,poz.w));
     tt.xyz = mat3(ViewProj) * tt.xyz;
gl_Position = vec4(tt.xyz,tt.w);

Если vPosition(входные вершины сетки) умножу на матрицу Projection то я вижу статические руки героя и они привязаны к камере.
То есть то что надо. Но нет анимации.

Правка: 11 окт. 2018 10:14

DimichПостоялецwww11 окт. 201810:20#8
Жесть какая-то, как у тебя view считается?
ronnikoПостоялецwww11 окт. 201810:29#9
Жесть какая-то, как у тебя view считается?

На CPU. Ты про рывки камеры на видео ?
DimichПостоялецwww11 окт. 201810:30#10
ronniko
> На CPU. Ты про рывки камеры на видео ?
Про вообще, матрицу как считаешь? Своими силами?
DimichПостоялецwww11 окт. 201810:33#11
У меня для 1ps было glm::inverse(camera_matrix), не видел проблем с умножением на руки и на всё.
camera_matrix - тупо матрица наблюдателя.

Правка: 11 окт. 2018 10:34

ronnikoПостоялецwww11 окт. 201810:34#12
Псевдо код так как на Fasme пишу. Left-hand matrix.
//Беру 2д координаты мыши и перевожу в mouseXYFloat
D3DXMatrixRotationAxis, matRotation, vRight,mouseXYFloat
D3DXVec3TransformCoord, vLook, vLook, matRotation
D3DXVec3TransformCoord, vUp, vUp, matRotation
D3DXVec3TransformCoord, vRight, vRight, matRotation
D3DXMatrixRotationAxis, matRotation,d3dvector1, mouseXYFloat
D3DXVec3TransformCoord, vLook, vLook, matRotation

D3DXVec3TransformCoord, vUp, vUp, matRotation
D3DXVec3TransformCoord, vRight, vRight, matRotation

D3DXVec3Normalize, vLook, vLook
D3DXVec3Cross, vRight, vUp, vLook
D3DXVec3Normalize, vRight, vRight
D3DXVec3Cross, vUp, vLook, vRight
D3DXVec3Normalize, vUp, vUp

View._11 = vRight.x
View._12 = vUp.x
View._13 = vLook.x
View._14 = 0.000000

View._21 = vRight.y
View._22 = vUp.y
View._23 = vLook.y
View._24 = 0.000000

View._31 = vRight.z
View._32 = vUp.z
View._33 = vLook.z
View._34 = 0.000000

View._41 = dot(vEye,vRight)
View._42 = dot(vEye,vUp)
View._43 = dot(vEye,vLook)
View._44 = 1.0

Правка: 11 окт. 2018 10:45

DimichПостоялецwww11 окт. 201810:41#13
+ Показать

Camera::GetMatrix - это view.

Правка: 11 окт. 2018 10:46

ronnikoПостоялецwww11 окт. 201810:47#14
Ты делаешь inverse(Transform::GetMatrix());
Я так не делаю.
Как я понял inverse(Transform::GetMatrix()); считает инвертированную матрицу.
Страницы: 1 2 3 Следующая »

/ Форум / Программирование игр / Графика

2001—2018 © GameDev.ru — Разработка игр