Алексей++
глобальный и пушистый
Глобальный модератор
Offline
Сообщений: 13
|
|
« Ответ #30 : 01-07-2009 11:12 » |
|
я бы сделал примерно так:
mPlanes[6] -это массив -член класса Camera
BeginScene(); { //перед началом пересчёт пирамид TheCamera1.RefreshPiramid();//это твоя функция CreatePiramid TheCamera2.RefreshPiramid(); //-----------------------------------
//отрисовываем, используя камеры
EndScene(); }
|
|
|
Записан
|
|
|
|
zuze
Опытный
Offline
Пол:
Россия, Москва
|
|
« Ответ #31 : 01-07-2009 11:25 » |
|
Я вот в интернете в некоторых местах видел такой способ.private: struct Planes { D3DXVECTOR3 m_normal; float m_distance;
inline void Normalise() { float denom = 1 / sqrtf((m_normal.x*m_normal.x) + m_normal.y*m_normal.y) + (m_normal.z*m_normal.z)); m_normal.x = m_normal.x * denom; m_normal.y = m_normal.y * denom; m_normal.z = m_normal.z * denom; m_distance = m_distance * denom; }
inline float DistanceToPoint(const D3DXVECTOR3& pnt) { return D3DXVec3Dot(&m_normal, &pnt) + m_distance; } } m_Planes[6];
Как думаешь этот способ лучше или хуже чем тот который ты предложил?
|
|
|
Записан
|
|
|
|
Алексей++
глобальный и пушистый
Глобальный модератор
Offline
Сообщений: 13
|
|
« Ответ #32 : 01-07-2009 11:38 » |
|
ну, последнее - это не способ, а описание плоскости ) Там же структура описани м массив задан. Думаю, их иожно объединить
|
|
|
Записан
|
|
|
|
zuze
Опытный
Offline
Пол:
Россия, Москва
|
|
« Ответ #33 : 01-07-2009 11:54 » |
|
Так я про это и спрашивал как описать плоскости? В твоём случае это массив класса и больше ничего, а в коде который я привёл в Ответе #31, как-то всё сложно. Можно ли без этого обойтись, объявив в конструкторе и диструкторе класса следующие строчки?Конструктор классаMatrix = NULL; mPlanes = new Camera[6];
Диструктор класса
|
|
|
Записан
|
|
|
|
Алексей++
глобальный и пушистый
Глобальный модератор
Offline
Сообщений: 13
|
|
« Ответ #34 : 01-07-2009 14:19 » |
|
ничего сложного не вижу: коли уж элементов ровно 6, а наличие их обязательно, то динамику городить не стОит, пусть будут объявлены так, как в предыдущем посте. Единственное, поюзать уже имеющийся тип плоскостей D3DXPLANE struct Planes:D3DXPLANE { inline void Normalise() { //это всё переписать по смыслу /* float denom = 1 / sqrtf((m_normal.x*m_normal.x) + m_normal.y*m_normal.y) + (m_normal.z*m_normal.z)); m_normal.x = m_normal.x * denom; m_normal.y = m_normal.y * denom; m_normal.z = m_normal.z * denom; m_distance = m_distance * denom; */ }
inline float DistanceToPoint(const D3DXVECTOR3& pnt) { //это всё переписать по смыслу /* return D3DXVec3Dot(&m_normal, &pnt) + m_distance; */ } } m_Planes[6];
class Camera { .... Planes Planes m_Planes[6]; .... }
|
|
|
Записан
|
|
|
|
Алексей++
глобальный и пушистый
Глобальный модератор
Offline
Сообщений: 13
|
|
« Ответ #35 : 01-07-2009 14:38 » |
|
кстати, нашёл таки, как этот мерзкий outlining вырубить Tools->Options->TextEditor->C/C++->Formatting (убрать 3 галки посеридине)
|
|
|
Записан
|
|
|
|
Алексей++
глобальный и пушистый
Глобальный модератор
Offline
Сообщений: 13
|
|
« Ответ #36 : 02-07-2009 00:18 » |
|
zuze, кстати, не знаешь, что значит при компиляции надпись
Embedding manifest...
она меня смущает ))
|
|
|
Записан
|
|
|
|
zuze
Опытный
Offline
Пол:
Россия, Москва
|
|
« Ответ #37 : 02-07-2009 08:49 » |
|
Embedding manifest... Вроде она значит что"не найден "ехе" файл проекта"
|
|
|
Записан
|
|
|
|
Алексей++
глобальный и пушистый
Глобальный модератор
Offline
Сообщений: 13
|
|
« Ответ #38 : 02-07-2009 08:52 » |
|
да нет, компилируется всё нормально. Это надпись о том, что встраивается некий манифест. Шо такое ? )
|
|
|
Записан
|
|
|
|
zuze
Опытный
Offline
Пол:
Россия, Москва
|
|
« Ответ #39 : 02-07-2009 08:59 » |
|
Алексей1153++
А ты мог бы полностью сообщение о предупреждении написать.
|
|
|
Записан
|
|
|
|
Алексей++
глобальный и пушистый
Глобальный модератор
Offline
Сообщений: 13
|
|
« Ответ #40 : 02-07-2009 09:06 » |
|
это не предупреждение, это просто лог. Я привёл строчку полностью
|
|
|
Записан
|
|
|
|
zuze
Опытный
Offline
Пол:
Россия, Москва
|
|
« Ответ #41 : 02-07-2009 09:14 » |
|
Манифест - это файл по сути практически тот же ini-файл, простой текстовый файл (в данном случае в формате XML), который содержит настройки для приложений.
Microsoft Visual Studio решается так:
project - properties - configuration properties - manifest tool - input and output - меняем Embed Manifest на No. Значения: $(TargetPath).manifest $(IntDir)\$(TargetFileName).embed.manifest.res No $(IntDir)\mt.dep
В Microsoft Visual C++ 6 пока не знаю.
|
|
|
Записан
|
|
|
|
Алексей++
глобальный и пушистый
Глобальный модератор
Offline
Сообщений: 13
|
|
« Ответ #42 : 02-07-2009 09:29 » |
|
так я про 2005 студию говорю - я там щас делаю. Вот в сэмплах нашёл такой файлик HDRLighting.manifest <?xml version="1.0" encoding="UTF-8" standalone="yes"?> <assembly xmlns="urn:schemas-microsoft-com:asm.v1" manifestVersion="1.0"> <assemblyIdentity version="1.0.0.0" processorArchitecture="*" name="Microsoft.DirectX SDK.HDRLighting" type="win32" /> <description>DirectX SDK Sample Program.</description>
<ms_asmv2:trustInfo xmlns:ms_asmv2="urn:schemas-microsoft-com:asm.v2"> <ms_asmv2:security> <ms_asmv2:requestedPrivileges> <ms_asmv2:requestedExecutionLevel level="asInvoker"> </ms_asmv2:requestedExecutionLevel> </ms_asmv2:requestedPrivileges> </ms_asmv2:security> </ms_asmv2:trustInfo> <dependency> <dependentAssembly> <assemblyIdentity type="win32" name="Microsoft.Windows.Common-Controls" version="6.0.0.0" processorArchitecture="*" publicKeyToken="6595b64144ccf1df" language="*" /> </dependentAssembly> </dependency> </assembly>
|
|
|
Записан
|
|
|
|
zuze
Опытный
Offline
Пол:
Россия, Москва
|
|
« Ответ #43 : 02-07-2009 09:37 » |
|
Если ты его не используешь этот файл попробуй отключить, как я написал.
|
|
|
Записан
|
|
|
|
zuze
Опытный
Offline
Пол:
Россия, Москва
|
|
« Ответ #44 : 02-07-2009 09:44 » |
|
Можешь попробовать в код вставить строчку #pragma comment(linker, "\"/manifestdependency:type='Win32' name='Microsoft.DirectX SDK.HDRLighting' version='1.0.0.0' processorArchitecture='X86' publicKeyToken='6595b64144ccf1df' language='*'\"")
|
|
|
Записан
|
|
|
|
Алексей++
глобальный и пушистый
Глобальный модератор
Offline
Сообщений: 13
|
|
« Ответ #45 : 02-07-2009 10:19 » |
|
ага, через опции убралось. Ещё немного мусора убрали с глаз )))
|
|
|
Записан
|
|
|
|
zuze
Опытный
Offline
Пол:
Россия, Москва
|
|
« Ответ #46 : 02-07-2009 10:23 » |
|
Алексей1153++ А что ты вдруг решил перейти на на Microsoft Visual Studio 2005?
|
|
|
Записан
|
|
|
|
Алексей++
глобальный и пушистый
Глобальный модератор
Offline
Сообщений: 13
|
|
« Ответ #47 : 02-07-2009 11:20 » |
|
( неважно ) кстати, у меня со светом почему то не выходит, может я формат FVF не так задаю. Там какие поля требуются ?
|
|
|
Записан
|
|
|
|
zuze
Опытный
Offline
Пол:
Россия, Москва
|
|
« Ответ #48 : 02-07-2009 12:45 » |
|
Если ты хочешь использовать освещение ты обязан задать материал, даже в том случае если ты используешь текстуры.Вот функция материала и света:// Функция установки освещения и материалов void LightMaterial(void) { // Создаём материал D3DMATERIAL9 Material; // Создаём освещение D3DLIGHT9 Light; D3DXVECTOR3 VectorDir;
// Обнуляем память под материал ZeroMemory(&Material, sizeof(D3DMATERIAL9)); // Задаём цвета для диффузного и цвета подсветки Material.Diffuse.r = Material.Ambient.r = 1.0f; Material.Diffuse.g = Material.Ambient.g = 1.0f; Material.Diffuse.b = Material.Ambient.b = 1.0f; Material.Diffuse.a = Material.Ambient.a = 1.0f; // Устанавливаем материал pDirect3DDevice->SetMaterial(&Material); // Обнуляем память под освещение ZeroMemory(&Light, sizeof(D3DLIGHT9)); // Тип света Light.Type = D3DLIGHT_DIRECTIONAL; // Количество красного в свете Light.Diffuse.r = 1.0f; Light.Diffuse.g = 1.0f; Light.Diffuse.b = 1.0f; // Вектор, задающий направление света в доль оси Х VectorDir = D3DXVECTOR3(1.0f, 0.0f, 0.0f); // Максимальное расстояние действия источника света Light.Range = 1000.0f; // Нормализуем вектор VectorDir и записываем в свойства // направления Light D3DXVec3Normalize((D3DXVECTOR3*)&Light.Direction, &VectorDir); // Устанавливаем свет pDirect3DDevice->SetLight(0, &Light); // Включаем свет с соответсвующим индексом pDirect3DDevice->LightEnable(0, TRUE); // Устанавливаем параметры рендеринга, включая освещение pDirect3DDevice->SetRenderState(D3DRS_LIGHTING, true); // Устанавливаем параметры рендеринга - ренормализации нормалей pDirect3DDevice->SetRenderState(D3DRS_NORMALIZENORMALS, true); // Устанавливаем параметры рендеринга - разрешения обработки отражаемой составляющей света pDirect3DDevice->SetRenderState(D3DRS_SPECULARENABLE, true); }
Использовать надо #define D3DFVF_TRIANGLEVERTEX (D3DFVF_XYZ|D3DFVF_NORMAL|D3DFVF_TEX1) или (если без текстур)#define D3DFVF_TRIANGLEVERTEX (D3DFVF_XYZ|D3DFVF_NORMAL)
|
|
|
Записан
|
|
|
|
Алексей++
глобальный и пушистый
Глобальный модератор
Offline
Сообщений: 13
|
|
« Ответ #49 : 03-07-2009 00:13 » |
|
а, понятно, я материал ещё не использовал. Странно, что в книге заговорили про свет раньше мателиалов
|
|
|
Записан
|
|
|
|
zuze
Опытный
Offline
Пол:
Россия, Москва
|
|
« Ответ #50 : 03-07-2009 07:22 » |
|
Я с проблемой со светом столкнулся, когда делал текстуры, я подумал, если у меня текстура, то и материала не нужно, а оказывается нужно.
|
|
|
Записан
|
|
|
|
zuze
Опытный
Offline
Пол:
Россия, Москва
|
|
« Ответ #51 : 03-07-2009 23:06 » |
|
Как инициализировать правельно плоскости?
Должна получится усечённая пирамида, притом центр "Ближней плоскости" должнен совпадать с точкой, где соединяются вектора камеры.
|
|
« Последнее редактирование: 04-07-2009 00:04 от zuze »
|
Записан
|
|
|
|
zuze
Опытный
Offline
Пол:
Россия, Москва
|
|
« Ответ #52 : 04-07-2009 00:28 » |
|
Я ошибся мы усечённу пирамиду строим с помощью отдельно разработанной функции, а значит сама структура что нулевыми значениями инициализируется?
|
|
|
Записан
|
|
|
|
Алексей++
глобальный и пушистый
Глобальный модератор
Offline
Сообщений: 13
|
|
« Ответ #53 : 04-07-2009 00:30 » |
|
вообще то, ближняя плоскость не должна быть ближе к камере, чем плоскость проекции, иначе начнёт появляться перевёрнутое избражение )
передняя и дальняя плоскости - можно построить по: Z координате+ вектор Look (нормаль ихняя) + вектор Up (он параллелен плоскостям)
насчёт боковых - так быстро я не соображу щас )
|
|
|
Записан
|
|
|
|
Алексей++
глобальный и пушистый
Глобальный модератор
Offline
Сообщений: 13
|
|
« Ответ #54 : 04-07-2009 00:31 » |
|
Я ошибся мы усечённу пирамиду строим с помощью отдельно разработанной функции, а значит сама структура что нулевыми значениями инициализируется?
про какую структуру речь ? сами матрицы и вектора не инициализируются, кстати. Обнулять лучше
|
|
|
Записан
|
|
|
|
zuze
Опытный
Offline
Пол:
Россия, Москва
|
|
« Ответ #55 : 04-07-2009 00:35 » |
|
Я имею в виду структуру m_Planes[6], а усечённая пирамида строится с помощью функции, которую я описал в "Ответе #29".
|
|
|
Записан
|
|
|
|
Алексей++
глобальный и пушистый
Глобальный модератор
Offline
Сообщений: 13
|
|
« Ответ #56 : 04-07-2009 00:40 » |
|
обнулять в конструкторе лучше
struct Plane:D3DXPLANE { Plane():D3DXPLANE(0,0,0,0) { } };
|
|
|
Записан
|
|
|
|
zuze
Опытный
Offline
Пол:
Россия, Москва
|
|
« Ответ #57 : 04-07-2009 00:43 » |
|
Понял.
А мне ещё посоветовали в функции getViewMatrix для создания матрицы вида использовать D3DXMatrixLookAtLH в место того что я ручками там всё писал.
Это дельный совет?
|
|
|
Записан
|
|
|
|
Алексей++
глобальный и пушистый
Глобальный модератор
Offline
Сообщений: 13
|
|
« Ответ #58 : 04-07-2009 00:47 » |
|
ну так то да, у меня тоже через неё сделано
void s_1153_3DCamera::GetView(D3DXMATRIX* pvm)const { ::D3DXMatrixLookAtLH(pvm, &m_Eye, &m_LookPoint, &m_Up); }
|
|
|
Записан
|
|
|
|
zuze
Опытный
Offline
Пол:
Россия, Москва
|
|
« Ответ #59 : 04-07-2009 00:50 » |
|
Понятно значит дельный совет.
Я сейчас спать я ещё со вчерашней ночи не спал постараюсь в эти выходные доделать и выложить viewing frustum.
|
|
|
Записан
|
|
|
|
|