КАК ЗАМОСТИТЬ ТЕКСТУРОЙ СОДЕРЖИМОЕ *.x ФАЙЛА

Работа с 2D и 3D графикой, видео, звуком.

Модератор: Mikle

[ANTI]Killer
Начинающий
Начинающий
 
Сообщения: 5
Зарегистрирован: 04.02.2007 (Вс) 13:44
Откуда: Орск

КАК ЗАМОСТИТЬ ТЕКСТУРОЙ СОДЕРЖИМОЕ *.x ФАЙЛА

Сообщение [ANTI]Killer » 04.02.2007 (Вс) 22:24

Помогите пожалуйста!!!

Я загужаю с помошью Direct3D (DirectX 8) *.x файл. В этом файле несколько обектов на которые нужно разным способом наложить текстуру. В моём примере текстура всегда растягивается. А мне нужно что бы она раскопировалась по всей области картинки "Замостить". Как мне это сделать?Я идиот! Убейте меня, кто-нибудь!?

Но при этом надо учитывать что все обекты находятся в *.x файле.

Вот часть моего кода:


Код: Выделить всё
'здесь идёт инициализация фала и текстур
Function InitGeometry() As Boolean
On Local Error Resume Next
Dim MtrlBuffer As D3DXBuffer
Dim i As Long
' вот тут грузится X файл
Set g_Mesh = g_D3DX.LoadMeshFromX(App.Path + "\Tiger.x", D3DXMESH_MANAGED, _
                               g_D3DDevice, Nothing, MtrlBuffer, g_NumMaterials)
If g_Mesh Is Nothing Then Exit Function

ReDim g_MeshMaterials(g_NumMaterials)
ReDim g_MeshTextures(g_NumMaterials)

Dim strTexName As String
init_load g_NumMaterials - 1, False
For i = 0 To g_NumMaterials - 1

    ' Копирование материала из буффера MtrlBuffer в массив g_MeshMaterials
    g_D3DX.BufferGetMaterial MtrlBuffer, i, g_MeshMaterials(i)

    ' Установка окружающего цвета материала (D3DX этого не делает)
    g_MeshMaterials(i).Ambient = g_MeshMaterials(i).diffuse
     
    ' Создание текстуры
    strTexName = g_D3DX.BufferGetTextureName(MtrlBuffer, i)
    If strTexName <> "" Then
        progress_load i, "Загрузка... " & strTexName
        Set g_MeshTextures(i) = g_D3DX.CreateTextureFromFile(g_D3DDevice, App.Path + "\" + strTexName)
    End If
Next

Set MtrlBuffer = Nothing

InitGeometry = True
End Function

'функция производет отрисовку сцены
Public Sub Render()
Dim i As Long

g_D3DDevice.Clear 0, ByVal 0, D3DCLEAR_TARGET Or D3DCLEAR_ZBUFFER, &HFF&, 1, 0

' Начало сцены
g_D3DDevice.BeginScene

SetupMatrices

' 3d объекты разделены на части (subsets).
' У каждой части свой материал и текстура.
' Рендеринг 3d объекта по частям в цикле:
For i = 0 To g_NumMaterials - 1
    ' Установка материала и текстуры для каждой части
    g_D3DDevice.SetMaterial g_MeshMaterials(i)
    g_D3DDevice.SetTexture 0, g_MeshTextures(i)
    ' Прорисовка части 3d объекта
    g_Mesh.DrawSubset i
Next

' Конец сцены
g_D3DDevice.EndScene

g_D3DDevice.Present ByVal 0, ByVal 0, 0, ByVal 0
End Sub

DirectXManiac
Продвинутый гуру
Продвинутый гуру
Аватара пользователя
 
Сообщения: 1543
Зарегистрирован: 03.11.2005 (Чт) 13:32
Откуда: из DirectX SDK

Сообщение DirectXManiac » 05.02.2007 (Пн) 8:31

[ANTI]Killer
Можешь в 3DS MAX сделать текстурирование потом в 3DS->X
Или можно вручную считать координаты текстур. Вытаскивай их из меша и пересчитывай как тебе надо!
#define ROFL 0xDDDD

[ANTI]Killer
Начинающий
Начинающий
 
Сообщения: 5
Зарегистрирован: 04.02.2007 (Вс) 13:44
Откуда: Орск

Сообщение [ANTI]Killer » 05.02.2007 (Пн) 11:54

DirectXManiac В 3D MAX я текстуру наложил, но она во-первых не позиционируется, во-вторых не сжимается или растягивается и в 3-х замошает объект (что как раз мне и нужно).

Второй вариант что ты мне педложил это то что мне нужно, но как это реализовать я не знаю. Я читал весь форум полностью но не нашол нормального ответа. И я знаю что ты DirectXManiac в этом рубиш. Не мог бы ты дать код или исходник скинуть. Ну хоть что нибудь сделай.
В конце концов я прочитал весь форум и ничего не нашол по этому значит что проблема актуальна и её нужно разобрать, что бы впреть таких небыло.

Спасибо.

d3drm
Астролог
Астролог
Аватара пользователя
 
Сообщения: 2873
Зарегистрирован: 29.05.2002 (Ср) 23:34
Откуда: МаСКвА

Сообщение d3drm » 05.02.2007 (Пн) 22:48

Не люблю я это говорить, но... Проблема непоставлена корректно, значит труднорешабельна. На данном этапе могу посоветовать почаще использовать знаки препинания и описать проблему детально.

Про фразу
разным способом наложить текстуру
можно было бы промолчать, но я все-таки скажу, что тут получается как в фильме Ширли-Мырли: "Дарагой! Ты такой разный!"

Пока можешь подумать над таким предположением. Если текстура натянутая на прямоугольник имеет координаты от (0,0) до (1,1), то для того чтобы этот прямоугольник замостить этой текстурой нам надо тупо умножить ее координаты на число тайлов. То есть новые координаты будут (0,0)-(10,10), если мы хотим иметь 10 * 10 тайлов этой текстуры на полигоне.
ХЎ

[ANTI]Killer
Начинающий
Начинающий
 
Сообщения: 5
Зарегистрирован: 04.02.2007 (Вс) 13:44
Откуда: Орск

Сообщение [ANTI]Killer » 06.02.2007 (Вт) 0:20

Re(1): d3drm

Не люблю я это говорить, но... Проблема непоставлена корректно, значит труднорешабельна. На данном этапе могу посоветовать почаще использовать знаки препинания и описать проблему детально.

Ну извините куда конкретнее. Как для детей. Всё расписано, по полочкам разложено. КОД ИСХОДНЫЙ есть из которого понять всё можно, ди ещё и с коментариями

Про фразу Цитата:
разным способом наложить текстуру

можно было бы промолчать, но я все-таки скажу, что тут получается как в фильме Ширли-Мырли: "Дарагой! Ты такой разный!"

А что догадаться нельзя какие самые простые способы бывают (растянуть, замостить...) тем более что я сказал ЗАМОСТИТЬ (В Виндовсе надеюсь все когда фон на рабочий стол ставили пробывали выбрать из выпадающего списка ЗАМОСТИТЬ. Пробывали? Видели что потом было?). Ну как мне ещё говорить. Вот скриншот там всё написано, но если уж и там не понятно, то.......
[img]АЭС.jpg[/img]

Пока можешь подумать над таким предположением. Если текстура натянутая на прямоугольник имеет координаты от (0,0) до (1,1), то для того чтобы этот прямоугольник замостить этой текстурой нам надо тупо умножить ее координаты на число тайлов. То есть новые координаты будут (0,0)-(10,10), если мы хотим иметь 10 * 10 тайлов этой текстуры на полигоне.

Опять же русским языком сказал не на квадратиках, не на полигонциках и паралипопедончиках, А НА ОБЪЕКТАХ СОДЕРЖАШИХСЯ В *.X файлах. Смотрите скрин там всё наглядно показано.

И ещё одно обяснение, если вдруг не понятно. Представьте, что я загрузих *.X файл (как выглядит сцена см. скриншот) в Visual Basic (код я приводил выше). Загрузил текстуры (опять же, смотрите код. там коментарии есть!). Всё это вывел на экран. И у меня на земле (да и везде) вместо ровненькой текстурки (как в скриншоте) КВАДРАТИКИ (т.е. она растянулась на всех объектах). ЧТО ДЕЛАТЬ?Я идиот! Убейте меня, кто-нибудь!????

DirectXManiac сказал умную вещь
Или можно вручную считать координаты текстур. Вытаскивай их из меша и пересчитывай как тебе надо!

Это то что нужно. Но я не знаю как это сделать!!!!!


Помогите пожалуйста!!!!
И, не обижайтесь! Просто я уже неделю бьюсь и не как добится не могу истины.
У вас нет доступа для просмотра вложений в этом сообщении.

d3drm
Астролог
Астролог
Аватара пользователя
 
Сообщения: 2873
Зарегистрирован: 29.05.2002 (Ср) 23:34
Откуда: МаСКвА

Сообщение d3drm » 06.02.2007 (Вт) 0:35

мне два раза повторять не надо, а вот тебе видимо следует.


Охрененную, просто фантастически мегасупирскую фразу сказал товаришь DXM, мы все от этой фразы тащимся и я в том числе:

Или можно вручную считать координаты текстур. Вытаскивай их из меша и пересчитывай как тебе надо!


На что ты ответил тоже хорошо:

Это то что нужно. Но я не знаю как это сделать!!!!!


То есть получается, что ты не знаешь что тебе нужно?

Мы тут все немного телепаты, поэтому я тебе все-таки объяснил что тебе нужно, но ты почему-то пропустил все мимо моска.

Универсальное решение есть только для универсальных случаев, какой может быть универсальный случай для сложной модели?

Вообще потрясно, что у тебя, цитирую:

не на полигонциках


Это кажется удивительным, ибо насколько я знаю сейчас кроме полигональной графики очень редко используется воксельная, а так как ты наверняка даже слабо представляешь что это такое, моге сделать предположение, что речь-таки идет о полигональной графике верно?

Следовательно у тебя есть набор полигонов. Понятно куда я клоню? Я, конечно, не товарищь DXM, поэтому дельные советы одним предложением высказывать неумею. Но если ты непропалишь в чем тут фишка, всегда рад помочь.

Подумай, как можно затайлить набор полигонов, к примеру. Ответ придет сам. Не забывай про умножение и все будет супир ;)
ХЎ

Bonesnapper
Постоялец
Постоялец
 
Сообщения: 434
Зарегистрирован: 12.09.2004 (Вс) 15:39

Сообщение Bonesnapper » 06.02.2007 (Вт) 11:00

d3dDevice.SetTextureStageState 0&, D3DTSS_TEXTURETRANSFORMFLAGS, D3DTTFF_COUNT2
D3DXMatrixIdentity Matrix
Matrix.m11 = 5 '---повторы по Х
Matrix.m22 = 7 '---повторы по Z
d3dDevice.SetTransform D3DTS_TEXTURE0, Matrix

не знаю как будет работать если травка и завод пользуются 1 текстурой - но думаю плохо
так что для травки ставь отдельную текстуру

Mikle
Изобретатель велосипедов
Изобретатель велосипедов
Аватара пользователя
 
Сообщения: 4148
Зарегистрирован: 25.03.2003 (Вт) 14:02
Откуда: Туапсе

Сообщение Mikle » 06.02.2007 (Вт) 11:54

[ANTI]Killer
1. Сначала, если в меше НЕТ текстурных координат, их нужно создать с помощью CloneMeshFVF.
2. Далее создать динамический массив того же типа, что и тип вертекса.
3. С помощью GetVertexCount узнать число вертексов в меше и сделать соответствующий ReDim массиву.
4. С помощью GetVertexBuffer считать данные вертексов из меша в массив
5. В массиве производишь любые манипуляции.
6. С помощью SetVertexBuffer отправить данные вертексов в меш.

Названия методов мог напутать - писал по памяти, под рукой нет SDK.

[ANTI]Killer
Начинающий
Начинающий
 
Сообщения: 5
Зарегистрирован: 04.02.2007 (Вс) 13:44
Откуда: Орск

Сообщение [ANTI]Killer » 06.02.2007 (Вт) 13:19

Bonesnapper
Спасибо!!!!!!!!!!!!!!!!!!!!
Ты гений!!! Всё работает. Вообще круто! Огромаднешое просто спасибо. Я уже неделю бьюсь над этим.

А вот ещё вопрос.
У меня после применения
d3dDevice.SetTextureStageState 0&, D3DTSS_TEXTURETRANSFORMFLAGS, D3DTTFF_COUNT2
D3DXMatrixIdentity Matrix
Matrix.m11 = 5 '---повторы по Х
Matrix.m22 = 7 '---повторы по Z
d3dDevice.SetTransform D3DTS_TEXTURE0, Matrix

Такстура на всех объектах, размножается. А можно ли зделать так, что бы, например на некоторых объектах текстура раскопировалась, ана других нет.

Если это возможно, то просто подскажи что изменить, или что за это отвечает, а я сам потом уже подгоню как нужно.

Если нужен мой исходник, то посмотри в начале темы я его давал.

Хакер
Телепат
Телепат
Аватара пользователя
 
Сообщения: 16478
Зарегистрирован: 13.11.2005 (Вс) 2:43
Откуда: Казахстан, Петропавловск

Сообщение Хакер » 06.02.2007 (Вт) 13:20

[offtopic]
[ANTI]Killer писал(а):Вот скриншот там всё написано, но если уж и там не понятно, то.......
[img]АЭС.jpg[/img]


Я вот подумал, у автора всё в порядке с головой?

[/offtopic]
—We separate their smiling faces from the rest of their body, Captain.
—That's right! We decapitate them.

[ANTI]Killer
Начинающий
Начинающий
 
Сообщения: 5
Зарегистрирован: 04.02.2007 (Вс) 13:44
Откуда: Орск

Сообщение [ANTI]Killer » 06.02.2007 (Вт) 13:32

Хакер - Я же тебе ничего не говорил. Что ты тогда лезиш?
Просто я был не в настроении, по тому что задаёш вопрос, а в ответ получаеш - глупую шутку или отмазку.

Как видно и ты этим страдаешь.
Ну не знаеш ты что ответить по теме так и не говори ничего. А вот так говорить
у автора плохо с головой
просто глупо.
Ты вообще, что то мне этим хотел сказать? Так договаривай. Только не здесь. Форум не мусорка, а место обсуждения конкретной темы. Вот сюда все свои претензии webmaster@orsk-zone.ru

Bonesnapper
Постоялец
Постоялец
 
Сообщения: 434
Зарегистрирован: 12.09.2004 (Вс) 15:39

Сообщение Bonesnapper » 06.02.2007 (Вт) 14:48

находишь сабсет который нужно замостить (например 3)


d3dDevice.SetTextureStageState 0&, D3DTSS_TEXTURETRANSFORMFLAGS, D3DTTFF_COUNT2
'создаем еденичные матрицы
D3DXMatrixIdentity Matrix
D3DXMatrixIdentity IdentityMatrix
Matrix.m11 = 5 '---повторы по Х
Matrix.m22 = 7 '---повторы по Z

For i = 0 To g_NumMaterials - 1
' Установка материала и текстуры для каждой части
g_D3DDevice.SetMaterial g_MeshMaterials(i)
g_D3DDevice.SetTexture 0, g_MeshTextures(i)
' Прорисовка части 3d объекта

if i=3
d3dDevice.SetTransform D3DTS_TEXTURE0, Matrix '-замостим
else
d3dDevice.SetTransform D3DTS_TEXTURE0, IdentityMatrix '-поставим по обычному
end if

g_Mesh.DrawSubset i
Next


Вернуться в Мультимедиа

Кто сейчас на конференции

Сейчас этот форум просматривают: Google-бот и гости: 7

    TopList  
cron