forum.boolean.name

forum.boolean.name (http://forum.boolean.name/index.php)
-   3D-программирование (http://forum.boolean.name/forumdisplay.php?f=12)
-   -   Работа с материалами (http://forum.boolean.name/showthread.php?t=9689)

HorNeS 02.11.2009 04:31

Работа с материалами
 
Вложений: 1
Всем привет, появился такой, вроде бы простой, но для меня сложный вопрос. :)
Решил заняться созданием нормальной системы материалов. Попробовал вот написать для теста распознавание пикнутой текстуры, опираясь на то что знаю (а я знаю я немного :)), но не получилось.
Скорее всего я где-то туплю (причем очень конкретно), но не могу понять где.
Имеем: один единый меш с разными наложенными на него текстурами.
Нужно: при "пикании" на меш узнавать на какую из наложенных текстур на меше мы попали.
Не получается: при "пикании" в любую часть меша выводится имя только одной текстуры (предположительно, самой последней из списка).

Семпл в аттаче, заранее спасибо. :)

HorNeS 03.11.2009 16:13

Ответ: Работа с материалами
 
Ау, ни у кого идей нету? :rolleyes:

Артем Валерьевич 03.11.2009 16:15

Ответ: Работа с материалами
 
Разбирал, ковырял, пока непридумал.

H@NON 03.11.2009 16:40

Ответ: Работа с материалами
 
используй логику, при пикании получаем номер пикнутой поверхности, для этого не нужно перебирать и записывать все в тип. Юзай справку по команде PickedSurface(), а так то вот :
Код:

;graphics init==============
Graphics3D 800, 600, 32, 2
SetBuffer BackBuffer()
camera = CreateCamera()
AmbientLight 255, 255, 255
;testmesh loading==========
testl = LoadMesh( "map.b3d" )
    PositionEntity testl, 0, 0, 10
    EntityPickMode testl, 2
;======================
While Not KeyHit(1)
;texture detection==========
playerf_pick = CameraPick( camera, MouseX(), MouseY() )
If playerf_pick = testl Then
    surface = PickedSurface()
    brush = GetSurfaceBrush( surface )
    material = GetBrushTexture( brush )
    currtex$ = TextureName$( material )
EndIf
;======================
UpdateWorld
RenderWorld

Text 10, 300, currtex$
;======================
Flip
Wend
End


Mr_F_ 03.11.2009 16:43

Ответ: Работа с материалами
 
у тебя в коде ты после пика перебираешь все сюрфейсы объекта, создаёшь объекты со всеми их тексами, затем назначаешь currtex имя последней в each-переборе тексы)
чето ты замутился

попробуй так:

Код:

Graphics3D 800, 600, 32, 2
camera = CreateCamera()
AmbientLight 255, 255, 255
;testmesh loading==========
testl = LoadMesh( "map.b3d" )
        PositionEntity testl, 0, 0, 10
        EntityPickMode testl, 2
;======================
currtex$=""

While Not KeyHit(1)
;texture detection==========
playerf_pick = CameraPick( camera, MouseX(), MouseY() )
If PickedEntity() = testl Then

        level_surface = PickedSurface()
        level_brush = GetSurfaceBrush( level_surface )
        level_material = GetBrushTexture( level_brush, 0 )
        currtex$=TextureName(level_material)

EndIf
;======================
UpdateWorld
RenderWorld
;draw current texture name===


Text 10, 300, currtex$
;======================
Flip
Wend
End

код не тестил, но вроде правильно должно быть
не секу че ты там хотел с типами сделать
сравнивай узнанный texturename с базой и узнавай материал
texturename лучше избавлять от пути, в примерах блица была функция StripPath$

---
H@NON опередил)

HorNeS 03.11.2009 16:48

Ответ: Работа с материалами
 
Оп-па, спасибо большое! :) А с типами это я уже отчаялся просто и наугад сделал. :D


Часовой пояс GMT +4, время: 12:34.

vBulletin® Version 3.6.5.
Copyright ©2000 - 2025, Jelsoft Enterprises Ltd.
Перевод: zCarot