Войти
ПрограммированиеФорумГрафика

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

Страницы: 1 2 3 Следующая »
#0
(Правка: 8:58) 8:56, 10 окт. 2018

Делаю шутер от первого лица.
Есть анимированые руки игрока.
Хочу что бы при повороте камеры руки тоже поворачивались вслед за камерой. То есть привязать к камере.

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

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

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


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


#1
9:23, 10 окт. 2018

сделай руки и камеру статичными, а двигай вокруг домики и монстров. Получится зашибись.

#2
11:00, 10 окт. 2018

Руки обычно копируют позицию и углы камеры

#3
(Правка: 11:37) 11:15, 10 окт. 2018

GLSL обычно не обычно делается в отличии от HLSL.
Потому и спросил.
Я долго сидел на HLSL а вот теперь стал писать под GLSL
И вижу что есть нюансы в GLSL.

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

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

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

#4
13:08, 10 окт. 2018

Перед рендером рук, выставляй в плюсах другую матрицу вида.
Т.е. мир рисуем одной матрицей вида, а руки - другой.
А шейдер на всё - один и тот же.
Иными словами, перед отрисовкой рук меняй соответствуюм образом положение камеры. Ресетни у камеры вращение например.

#5
(Правка: 14:45) 14:40, 10 окт. 2018

ronniko
> то подскажите как умножали анимированные вершины на матрицу камеры.
Брали и умножали?

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

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

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

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

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

#6
(Правка: 9:50) 9:48, 11 окт. 2018

Сделал но фигово.


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

#7
(Правка: 10:14) 9:53, 11 окт. 2018

Вот как сейчас делаю в вершинном шейдере. Матрицы под левостороннюю систему.

#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 то я вижу статические руки героя и они привязаны к камере.
То есть то что надо. Но нет анимации.

#8
10:20, 11 окт. 2018

Жесть какая-то, как у тебя view считается?

#9
10:29, 11 окт. 2018
Жесть какая-то, как у тебя view считается?

На CPU. Ты про рывки камеры на видео ?
#10
10:30, 11 окт. 2018

ronniko
> На CPU. Ты про рывки камеры на видео ?
Про вообще, матрицу как считаешь? Своими силами?

#11
(Правка: 10:34) 10:33, 11 окт. 2018

У меня для 1ps было glm::inverse(camera_matrix), не видел проблем с умножением на руки и на всё.
camera_matrix - тупо матрица наблюдателя.

#12
(Правка: 10:45) 10:34, 11 окт. 2018

Псевдо код так как на 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

#13
(Правка: 10:46) 10:41, 11 окт. 2018
+ Показать

Camera::GetMatrix - это view.
#14
10:47, 11 окт. 2018

Ты делаешь inverse(Transform::GetMatrix());
Я так не делаю.
Как я понял inverse(Transform::GetMatrix()); считает инвертированную матрицу.

Страницы: 1 2 3 Следующая »
ПрограммированиеФорумГрафика