Суровая правда жизни о Direct3D
Спецвыпуск Хакер, номер #004, стр. 004-098-7
Листинг №6 - main.cpp, создание вершин логотипа Х
D3DVECTOR vNormal(0, 0, -1); //Нормаль - перпендикуляр к нашему полигону
vtx[0] = D3DVERTEX(D3DVECTOR(-2, 0, 0), -vNormal, 0, 0);
vtx[1] = D3DVERTEX(D3DVECTOR( 0, -2, 0), -vNormal, 0, 0);
vtx[2] = D3DVERTEX(D3DVECTOR( 0, 0, -2), -vNormal, 0, 0);
vtx[5] = D3DVERTEX(D3DVECTOR(-2, 0, 0), vNormal, 0, 0);
vtx[4] = D3DVERTEX(D3DVECTOR( 0, -2, 0), vNormal, 0, 0);
vtx[3] = D3DVERTEX(D3DVECTOR( 0, 0, -2), vNormal, 0, 0);
Конец листинга 6.
Пытка №4 - интересно, а какого цвета у него кровь?
Как следует из названия, мы здесь будем заниматься цветом. То есть материалом и лампой. Сначала проинициализируем материал. У него 5 параметров. 4 (dcvDiffuse, dcvAmbient, dcvSpecular и dcvEmissive) из них типа D3DCOLORVALUE - данные о цвете. Последний (dvPower) - степень отражения цвета (блики). Параметры dcvEmissive и dvPower нам не нужны - поэкспериментируешь с ними позже. Параметр dcvDiffuse реагирует с соответствующим параметром лампы (об этом позже) и является самым влиятельным на цвет параметром. dcvAmbient, как и предыдущий, реагирует с соответствующим параметром лампы. dcvSpecular - цвет бликов. Вместе с dvPower можно добиться интересных результатов. Какой цвет где поставить - увидишь в листинге. Чтобы применить этот материал, надо воспользоваться методом SetMaterial с параметром - указателем на структуру D3DMATERIAL7 (то есть нацарапаешь там &mat - нашу переменную типа D3DMATERIAL7). Теперь лампа. Это уже интересней. Правда, у нее куча параметров, что к чему - объяснять долго - зри в SDK. Я объясню только нужные нам сейчас. Это dcvDiffuse, dcvAmbient, dcvSpecular, dvPosition, dltType, dvAttenuation0, dvRange. Первые три объяснять не надо, они просто реагируют с соответствующими параметрами материала. dvPosition - позиция в пространстве, dltType - тип лампы (D3DLIGHT_POINT - точечный, то есть наш, не имеет направления, но имеет четко заданную позицию; D3DLIGHT_SPOT - забавный тип, имеет позицию и направление, светит неким конусом (подробнее в SDK); D3DLIGHT_DIRECTIONAL - не имеет позиции, но имеет направление), dvAttenuation0 - некий параметр, отвечающий за силу свечения лампы на определенном расстоянии (убойная вещь для создания ламп с нелинейной силой свечения), а dvRange - как далеко будет светить. Создать наш свет ("Да будет свет!", - сказал монтер и попу фосфором натер.) можно методом SetLight, первый его параметр - номер лампы (0), а второй - указатель на лампу (&d3dLight). А затем его надо заставить светить. Метод LightEnable это сделает. Первый параметр - номер лампы (0), второй - bool (true - разрешить светить, false - противоположное). А теперь торжественно скатывай все с листинга.
Листинг № 7 - Main.cpp, материал и свет.
mat.dcvDiffuse.r = (D3DVALUE)0.7;
mat.dcvDiffuse.g = (D3DVALUE)1.0;
mat.dcvDiffuse.b = (D3DVALUE)0.7;
mat.dcvDiffuse.a = (D3DVALUE)1.0;
mat.dcvAmbient.r = (D3DVALUE)0.0;