ronniko
До такого экшена как на картинке, мне еще очень далеко, тут как минимум придется изучить анимацию, шейдеры и прикрутить рабочий код вычисления пересечений.
Сделал простенькую стрельбу по ящикам, ну или другими словами написал код расчета пересечения между моделями.
Для перемещения модельки ядра написал вот такой код
snariadTarget = D3DXVECTOR3(pos.x, pos.y+0.3, pos.z); if ( ::GetAsyncKeyState( VK_LBUTTON) & 0x8000f) { ogoni = 1; } if ( ogoni == 1) { Ogoni( ); } else { vectorTarget = D3DXVECTOR3( YawY, anglePitch, YawX); Vmove = snariadTarget; } D3DXMATRIX fire; D3DXMatrixTranslation( &fire, Vmove.x, Vmove.y, Vmove.z); D3DMATRIX matFire( fire); d3ddev->SetTransform( D3DTS_WORLD, &matFire); DrawModel( snariad);
Код функции Ogoni
void Ogoni() { VTarget = vectorTarget*1.0f; Vmove -= VTarget; numtime = numtime + 1; if ( numtime == 60) { numtime = 0; ogoni = 0; } }
После выполнения прорисовки снаряда идет код прорисовки ящика
if (easik1 == 0) { D3DXMatrixTranslation( &iasik, 5.0f, 1.6f, 3.9f); D3DXMATRIX corobca( iasik); d3ddev->SetTransform( D3DTS_WORLD, &corobca); DrawModelIntersect( easik, 1); } if ( easik2 == 0) { D3DXMatrixTranslation( &iasik, -3.8f, 1.7f, -31.0f); D3DXMATRIX corobca1( iasik); d3ddev->SetTransform( D3DTS_WORLD, &corobca1); DrawModelIntersect( easik, 2); } if ( easik3 == 0) { D3DXMatrixTranslation( &iasik, 7.0f, 28.7f, -58.0f); D3DXMATRIX corobca2( iasik); d3ddev->SetTransform( D3DTS_WORLD, &corobca2); DrawModelIntersect( easik, 3); }
Код прорисовки модели там же собираются координаты модели в вектора vecBoundingBoxMin1 и vecBoundingBoxMax1.
void DrawModelIntersect(MODEL *model, int nom) { int nomea = nom; // Рисуем каждый субсет меша for ( DWORD i = 0; i<model->material_count; i++) { // Назначаем для субсета материал и текстуру d3ddev->SetMaterial( &model->materials[i]); d3ddev->SetTexture( 0, model->textures[i]); // Рисуем субсет меша model->mesh->DrawSubset( i); model->mesh->LockVertexBuffer( D3DLOCK_READONLY, ( LPVOID*)&pVertices1); D3DXComputeBoundingBox( ( D3DXVECTOR3*)pVertices1, model->mesh->GetNumVertices( ), D3DXGetFVFVertexSize( model->mesh->GetFVF( )), &vecBoundingBoxMin1, &vecBoundingBoxMax1); model->mesh->UnlockVertexBuffer( ); //D3DXVec3TransformCoord(&vect11, &vecBoundingBoxMin1, &transf); D3DXVec3TransformCoord( &vecBoundingBoxMin1, &vecBoundingBoxMin1, &iasik); D3DXVec3TransformCoord( &vecBoundingBoxMax1, &vecBoundingBoxMax1, &iasik); } peresecenie( vecBoundingBoxMax1, vecBoundingBoxMin1, Vmove, nomea); }
Ну и код расчета пересечения между вершинами ящиков и координатами движения модели снаряда.
void peresecenie(D3DXVECTOR3 vec1, D3DXVECTOR3 vec2, D3DXVECTOR3 snariadd, int nomea) { if ( snariadd.x < vec1.x && snariadd.x > vec2.x && snariadd.z < vec1.z && snariadd.z > vec2.z && snariadd.y < vec1.y && snariadd.y > vec2.y) { if ( nomea == 1) { easik1 = 1; } if ( nomea == 2) { easik2 = 1; } if ( nomea == 3) { easik3 = 1; } } }
Вот что получилось.
Flying engine набирает обороты.
Аффтар жжот!
void DrawModelIntersect(MODEL *model, int nom)
samrrr
> Аффтар жжот!
Пока нет, я еще не прошел уроки по анимации и шейдерам, так что пока не знаю что это такое.
Mikki
> Пока нет,
Это так кажется. Скоро начнёшь жаловаться на крашашиеся плюсы.
Я думаю с текущими знаниями ты сольешься где то на попытке убрать зубчики у теней.
samrrr
> Скоро начнёшь жаловаться на крашашиеся плюсы.
Ну пока ни разу не крашнулось.
> ты сольешься где то на попытке убрать зубчики у теней
Ну до этого я еще не дошел
samrrr
> ты сольешься где то на попытке убрать зубчики у теней.
Не знаю что в них такого особенного но в играх часто видел эти самые зубчики у теней, могу предположить если у разработчиков самих игр такое не получилось что с чего это должно получится у меня?
Если не получится то видимо это неисправляемый баг который не смогли исправить даже разработчики игр.
Mikki
> Ну пока ни разу не крашнулось.
Это невозможно.
Mikki
> Не знаю что в них такого особенного но в играх часто видел эти самые зубчики у
> теней
Они тоже неосилили. Но в анреале то смогли, да даже в унижайне смогли.
Mikki
> Если не получится то видимо это неисправляемый баг который не смогли исправить
> даже разработчики игр.
Просто есть игры на движках 20 летней давности.
samrrr
> Это невозможно.
Если будет крашиться то можно сделать по нормальному, что бы этого не было.
samrrr
> Они тоже неосилили. Но в анреале то смогли, да даже в унижайне смогли.
Ну до этого мне еще очень далеко.
samrrr
> Но в анреале то смогли, да даже в унижайне смогли.
Не смогли, просто повысили разрешение "зубчиков" и размылили край тени, чтобы не так заметно было.
MrShoor
> Не смогли, просто повысили разрешение "зубчиков" и размылили край тени, чтобы
> не так заметно было.
А это что тогда?
https://docs.unrealengine.com/5.0/en-US/hardware-ray-tracing-in-unreal-engine/
samrrr
> А это что тогда?
> https://docs.unrealengine.com/5.0/en-US/hardware-ray-tracing-in-unreal-engine/
Это же UE5. С такими тенями еще ни одной игры не вышло. Давай что-нибудь реалистичное.
MrShoor
> Не смогли, просто повысили разрешение "зубчиков"
Так если повысить разрешение зубчиков до разрешения экрана, то оно и будет смогли.
MrShoor
> и размылили край тени
ну и размылить согласно параметрам конечно, а то тени без пенумбры людям не заходят, стенсильные быстро отмерли.
samrrr
> на крашашиеся плюсы
Санитайзер очень помогает. По мне так вообще обязательная вещь.
MrShoor
> Это же UE5.
Вообщето эта фича в анреале довольно давно.
Super_inoy
> Так если повысить разрешение зубчиков до разрешения экрана, то оно и будет
> смогли.
В этом и фокус, но в унижайне ну оч постарались и даже при больших пикселях зубчики как-то размыли.
MikeNew
> Санитайзер очень помогает.
Если программа крашится на санитайзере, а не на нулл поинтерр аццесс, то краш не перестаёт быть крашем.