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=1832)

untonee 03.11.2006 15:58

Как узнать размер меша?
 
Привет!
Подскажите, как узанть загруженного меша:
m=LoadMesh("mesh.3ds")

необходимо узнать размер m, по x, y, z.

И в догонку езе вопрос:
Как можно конверить из одной системы измерения в другую, а именно:
я использовал при моделинге в максе одну систему измерения(сантиметры), теперь вставляю объект в Blitz3d, здесь другая система (General unit)... Как выполнить преобразование в блитце?

jimon 03.11.2006 17:46

Re: Как узнать размер меша?
 
untonee
Scale именно меша всегда равен 1,1,1

а размер всмысле длина,высота и тд делается так :)
(я просто именно в блице не помню как)
перебираются все вертексы
делается 6 переменых X_min,X_max,Y_min и тд
положение каждого вертекса проверяется на мин,макс

и если выходит за границы то пишется в мин,макс положение етого вертекса

потом X_dist = abs(X_min) + abs(X_max) и тд
и получаем то что надо

2) приравнивай условные еденицы
к примеру в пусть будет 1 условная еденица в блице равна 1 см
вот и дерзай, хотя я использую 1 у.е. как 1 метр

Diplomat 03.11.2006 18:27

Re: Как узнать размер меша?
 
2 Jimon: Есть и такое мнение...

2 untonee:
1. MeshWidth, MeshHeight, MeshDepth.
2. ScaleMesh, ScaleEntity, фраза "а мы будем называть "ГенерикЮнитсы" метрами!"- и вперед.

Повторять не-своё коронное высказывание про необходимость обращения к прилагающимся материалам вслух уже не буду, ибо это банально. Но знайте: я его несколько раз подряд произнес про себя.
:)

jimon 03.11.2006 19:55

Re: Как узнать размер меша?
 
вот чего то я не понимаю в идеологии создателя блица

меш ето набор вертексов,индексов и текстурных координат + текстурки
нафига хранить в месте с мешем матрицу его трансформации ?

а потом еще и у ентити будет матрица трансформации ... в итоге на один вертекс мы получаем аж две матрицы
когда можно обойтись одной
и зачем ? :)

HolyDel 03.11.2006 21:04

Re: Как узнать размер меша?
 
Цитата:

Сообщение от jimon
а потом еще и у ентити будет матрица трансформации ... в итоге на один вертекс мы получаем аж две матрицы
когда можно обойтись одной
и зачем ? :)

для одного меша может быть несколько ентити.

untonee 03.11.2006 21:44

Re: Как узнать размер меша?
 
Цитата:

Сообщение от Diplomat
2 Jimon: Есть и такое мнение...

2 untonee:
1. MeshWidth, MeshHeight, MeshDepth.
2. ScaleMesh, ScaleEntity, фраза "а мы будем называть "ГенерикЮнитсы" метрами!"- и вперед.

Читал доки, читал, читал - вот только на тему Entity!... Всё обсмотрел!
Но вот чего-то отложилось у меня, что после загрузки это уже Entity!!!
Да уж... Всегда спешу!

Цитата:

Повторять не-своё коронное высказывание про необходимость обращения к прилагающимся материалам вслух уже не буду, ибо это банально. Но знайте: я его несколько раз подряд произнес про себя.
:)
И такое бывает, на то он и форум! Если бы не бало сам бы нашел... А так легкое средство, умные люди и инет всегда рядом, трудно не воспользоваться... :friends:

jimon 03.11.2006 21:48

Re: Как узнать размер меша?
 
Цитата:

для одного меша может быть несколько ентити.
угу
и что ?

HolyDel 04.11.2006 01:23

Re: Как узнать размер меша?
 
Цитата:

Сообщение от jimon
угу
и что ?

И то. Один меш может отоброжаться в сотне разных поз, оставаясь самим собой. В видеопамяти все ети вершины и т.д. и т.п. сохраняются в единственном екземпляре и потом отображаются по разному, согласно матрицы ентити. И к тому же, по моему скромному мнению, матрицы для меша нет, если 10 прописать ScaleMesh m,2,2,2 то он увеличится ровно в 1024 раза, а не в 2 как можно было бы предположить.

jimon 04.11.2006 12:35

Re: Как узнать размер меша?
 
HolyDel
ну если прописать ScaleMesh m,2,2,2
то передвинутся все вершины меша ...
тоесть матрицы для меша отдельной в блице нету
значит гуд :) заблуждался чето

MiXaeL 06.11.2006 22:24

Re: Как узнать размер меша?
 
А можно узнать размер не-меша (MD2, BSP и т.д.)?

jimon 06.11.2006 22:34

Re: Как узнать размер меша?
 
Michael
BSP,MD2 ето формат моделей
почему они будут не мешем ? меш ето набор треугольников который рендерится ...

tormoz 06.11.2006 23:06

Re: Как узнать размер меша?
 
Джимон, ты не прав.

Ответ: средствами Блитц никак.

BoB 06.11.2006 23:35

Re: Как узнать размер меша?
 
Вот еще вопрос.
Можно ли в Blitz3D изменять размер у анимированной модели. Кости biped экспорт в b3d. В самом Максе уменьшить без искажений не получается, т.к. модификатор skin не позволяет.

jimon 07.11.2006 00:09

Re: Как узнать размер меша?
 
tormoz
ну теоретически я прав ?

или хоч сказать что я не могу загрузить MD2 как меш
кинуть его в кеш мешей
и создать кучу ентити ?

ps. разве в блице так низя ? :)
в ирлихте мона :)

ps2. что мешает узнать размер обьекта по AABBOX ?

HolyDel 07.11.2006 00:52

Re: Как узнать размер меша?
 
Цитата:

Сообщение от jimon
tormoz

ps2. что мешает узнать размер обьекта по AABBOX ?

Что такое AABBOX?

Diplomat 07.11.2006 01:23

Re: Как узнать размер меша?
 
Господа, особенно Джимон, пожалуйста! Релятивистский флуд на тему "...А вот у нас на Колыме МД2- это меш..." неконструктивен, да ко всему является еще и оффтопом.

...

По САБЖ-у: ИМХО, размеры любого обьекта можно узнать в редакторе перед экспортом, вручную записать их в файл, а потом считать из файла в Блице.
Более того: таким образом можно хранить намного больше данных об обьекте, чем предоставляют средства как Блица, так и мифического Иррлича.
;)

jimon 07.11.2006 09:05

Re: Как узнать размер меша?
 
AABBOX
ето воображаемая коробка по осям
она обычно применяется для быстрых колизий :)

т.е. ето бокс в которую меш вписывается
но грани етого бокса паралельны осям

HolyDel 08.11.2006 02:04

Re: Как узнать размер меша?
 
C моей точки зреня ЕТО:

Цитата:

Сообщение от jimon
untonee

потом X_dist = abs(X_min) + abs(X_max) и тд
и получаем то что надо

работать не будет.
пример X_min=2; X_max=6 (width=4, вроде понятно как считать;) ). короче X_dist=X_max-X_min. для отрицательных X понятно что будет работать и Jimon-овский вариант.

Теперь по AABBOX. Как я понял, ето задается программно, и как с помощью етого определить размер объекта :dontknow: . А мне между прочим тоже интересно, можно как-нить узнать размер объекта (помимо mesh-a), программным способом (не чтением из файла)

jimon 08.11.2006 09:02

Re: Как узнать размер меша?
 
http://www.gamedev.ru/terms/AABB

AABB :) (ну иногда называется aabbox в некоторых двигах)
оно задается именно ентити
если ентити не вращать - тоесть углы 0,0,0
то получаем что высота,ширина и длина етого AABB
являются также высотой,шириной и длиной меша етого ентити

да кстати
вот тут коечто есть
http://gamemaker.webservis.ru/articles/engine/d8.htm

WaReZ_MEN 26.05.2007 13:44

Re: Как узнать размер меша?
 
а как узнать размер AnimMesh ? MeshWidth,MeshHeight, MeshDepth Эти функций возвращают -120 000. И еще почему EntityPickMode mode,2 не работает для АнимМесш?

HolyDel 26.05.2007 15:06

Re: Как узнать размер меша?
 
уже не раз обсуждалась проблема аниммешов, ето не один объект, а несколько пипарентенных к ентити хендл которого и представляет хендл аниммеша.
надо пользоваться рекурсией чтобы можно было принимать текстуру, цвет, альфу, режим "пиканься" и т.д.
размер аниммеша можно узнать так, находим максимальное иминимальное значение вертексов каждого чайлда, прибавляем к етому смещение относительно родителя и находим таким образом максималные и минимальные координаты по каждой из трех осей, потом из максимальных вычитаем минимальную и полуцчаем размер по какой-либо из оси.

Platon 26.05.2007 15:10

Re: Как узнать размер меша?
 
Цитата:

надо пользоваться рекурсией
2WaReZ_MEN
Вот так примерно:
Код:

Function AnimEntityPickMode(Mesh, Mode)
  For i = 0 To (CountChildrens(Mesh) - 1)
      Child = GetChild(Mesh, i)
      AnimEntityPickMode(Child, Mode)
      EntityPickMode(Child, Mode)
  Next
End Function


WaReZ_MEN 26.05.2007 15:14

Re: Как узнать размер меша?
 
HolyDel я написал вот такое ну она почемуто не работает типа переполнение памяти говорит.
Код:

Function AnimEntityWidth#(aent)
Local ent,rez#
rez#=MeshWidth(aent)
For c=1 To CountChildren(aent)
 ent=GetChild(aent,c)
 If CountChildren(ent)>0
 AnimEntityWidth#(ent)
 Else
 rez#=MeshWidth(ent)
 EndIf
Next
Return rez#
End Function
 
Function AnimEntityHeight#(aent)
Local ent,rez#
rez#=MeshHeight(aent)
For c=1 To CountChildren(aent)
 ent=GetChild(aent,c)
 If CountChildren(ent)>0
 AnimEntityHeight#(ent)
 Else
 rez#=MeshHeight(ent)
 EndIf
Next
Return rez#
End Function
 
Function AnimEntityDepth#(aent)
Local ent,rez#
rez#=MeshDepth(aent)
For c=1 To CountChildren(aent)
 ent=GetChild(aent,c)
 If CountChildren(ent)>0
 AnimEntityDepth#(ent)
 Else
 rez#=MeshDepth(ent)
 EndIf
Next
Return rez#
End Function


HolyDel 26.05.2007 22:02

Re: Как узнать размер меша?
 
stack overflow?
вот алгоритм находи ВСЕ чилды нужног нам аниментити.
переираем все его чилды и находим левую и правую границу.
Вот, я написал кртину чтоб было понятнее.
http://likosoft.ucoz.ru/ameshsize.PNG

вот код, только идея, на работоспособность не проверял.
ПС. етот ентити должен быть неотскален.
Код:


Type childent
        Field ent
End Type

Function AnimMeshWidth(ent)
        GetAllChilds(ent)
        For ce.childent=Each childent
                If ce=First childent
                       
                        minx=EntityX(ce\ent)-MeshWidth(ce\ent)
                        maxx=EntityX(ce\ent)+MeshWidth(ce\ent)
                        Else
                       
                        If minx>EntityX(ce\ent)-MeshWidth(ce\ent) Then minx=EntityX(ce\ent)-MeshWidth(ce\ent)
                        If maxx<EntityX(ce\ent)+MeshWidth(ce\ent) Then maxx=EntityX(ce\ent)+MeshWidth(ce\ent)                       
                EndIf
        Next
        Delete Each childent
        Return maxx-minx
End Function

Function GetAllChilds(ent)
                For i=1 To CountChildren(ent)
                        If CountChildren(ent)>0
                                GetAllChilds(ent)
                        Else
                                ce.childent=New childent
                                ce\ent=ent
                        EndIf
                Next
End Function


Render 27.05.2007 12:18

Re: Как узнать размер меша?
 
Вот как я определяю размеры тел из макса с учётом скейла

Пример для кубика

Код:

dimens_x# = MeshWidth #(child)*0.5*EntityScaleX#(child)
dimens_y# = MeshHeight #(child)*0.5*EntityScaleY#(child)
dimens_z# = MeshDepth#(child)*0.5*EntityScaleZ#(child)

Function EntityScaleX#(ent%)
 row=0
 el1# = GetMatElement(ent,row,0)
 el2# = GetMatElement(ent,row,1)
 el3# = GetMatElement(ent,row,2)
 Return Sqr(el1*el1+el2*el2+el3*el3)
End Function

Function EntityScaleY#(ent%)
 row=1
 el1# = GetMatElement(ent,row,0)
 el2# = GetMatElement(ent,row,1)
 el3# = GetMatElement(ent,row,2)
 Return Sqr(el1*el1+el2*el2+el3*el3)
End Function

Function EntityScaleZ#(ent%)
 row=2
 el1# = GetMatElement(ent,row,0)
 el2# = GetMatElement(ent,row,1)
 el3# = GetMatElement(ent,row,2)
 Return Sqr(el1*el1+el2*el2+el3*el3)
End Function

0.5 - потому что размер примитивов в 3дМаксе в 2 раза больше блитцевских.

WaReZ_MEN 27.05.2007 16:19

Re: Как узнать размер меша?
 
ДА обычный меш то легко моно тросто размер умновжить на процент скалинга и бедет тебе счастье... Меня то Анемированые меши интересуют...

WaReZ_MEN 28.05.2007 01:49

Re: Как узнать размер меша?
 
Cyan не работает
Код:

Function AnimEntityPickMode(Mesh, Mode)
  EntityPickMode(Mesh, Mode)
  For i = 1 To (CountChildren(Mesh))
      Child = GetChild(Mesh, i)
      If CountChildren(Child)>0
        AnimEntityPickMode(Child, Mode)
      Else EntityPickMode(Child, Mode)
      EndIf
  Next
End Function


HolyDel 28.05.2007 02:01

Re: Как узнать размер меша?
 
вроде должноработать, попробуй так:
Код:

Function AnimEntityPickMode(Mesh, Mode)
  EntityPickMode(Mesh, Mode)
  For i = 1 To (CountChildren(Mesh))
      Child = GetChild(Mesh, i)
      AnimEntityPickMode(Child, Mode)
  Next
End Function


WaReZ_MEN 28.05.2007 02:03

Re: Как узнать размер меша?
 
не работает

HolyDel 28.05.2007 02:10

Re: Как узнать размер меша?
 
а ты с какими цифрами вызываеш?
надеюсь с 2, а то в противных случаях придеться еще и радиус или коробку задавать.

WaReZ_MEN 28.05.2007 02:44

Re: Как узнать размер меша?
 
Код:

....
 Pick%= CameraPick(Cam,MouseX(),MouseY())
....

For  Unit.TUnit = Each TUnit
        If Unit<>Null
        ;        EntityPickMode        Unit\Model,2
                AnimEntityPickMode(Unit\Model,2)
                If Pick%= Unit\Model
                          Unit\Selected=True
                        Else
                                Unit\Selected=False
                        EndIf 
                EndIf         
    Next   

....

Function AnimEntityPickMode(Mesh, Mode)
  EntityPickMode(Mesh, Mode)
  For i = 1 To (CountChildren(Mesh))
      Child = GetChild(Mesh, i)
      AnimEntityPickMode(Child, Mode)
  Next
End Function


HolyDel 28.05.2007 02:50

Re: Как узнать размер меша?
 
1. необязательно каждый цинкл проводить изминение пикабелити этих объектов. достаточно ето сделать один раз, во время их создания.
ПС. а можно весь код в студию?

WaReZ_MEN 28.05.2007 02:51

Там очень много что канкретно нужно?

С простыми (не анемироваными) мешами все ок, а с анемироваными не получается

HolyDel 28.05.2007 02:56

Re: Как узнать размер меша?
 
1. как показывается выделение юнитов
2. ВЕСЬ код от Pick%= CameraPick(Cam,MouseX(),MouseY()) до If Pick%= Unit\Model.
3. вынеси плиз AnimEntityPickMode(Unit\Model,2), туда, где создаются юниты.

WaReZ_MEN 28.05.2007 03:03

Re: Как узнать размер меша?
 
Код:

    Pick%= CameraPick(Cam,MouseX(),MouseY())
If MouseHit(1)
                    If CursorStatus=0 Then SelectBuilding(): SelectUnit():                                  MouseHitMap(PickedX(),PickedZ()) 
                    If CursorStatus=1 Then PostBuilding()             
                EndIf
       
        If KeyHit(1)
          If CursorStatus=0 Then Exit
              ClearMouseStatus()
              CursorStatus=0
        EndIf
         
          If KeyHit(6) Then CreateUnit( 1,PickedX(),PickedY()+1,PickedZ()) 

        DrawSelectUnit()
        DrawImage MousePointer,MouseX(),MouseY()

        Flip
Forever



Function SelectUnit()           
    For  Unit.TUnit = Each TUnit
        If Unit<>Null
        ;        EntityPickMode        Unit\Model,2
;                AnimEntityPickMode(Unit\Model,2) ;перенес в создание юнита
                If Pick%= Unit\Model
                          Unit\Selected=True
                        Else
                                Unit\Selected=False
                        EndIf 
                EndIf         
    Next   
End Function

Function DrawSelectUnit()
max#=10000000.0
 For  Unit.TUnit = Each TUnit
        If Unit<>Null
                If Unit\Selected=True
                                CameraProject(Cam,EntityX(Unit\Model),EntityY(Unit\Model)+Unit\ModelHeight#+0.5,EntityZ(Unit\Model))               
                If EntityInView(Unit\Model,Cam)=True               
                                tY=TerrainY(terrain,EntityX(Unit\Model),EntityY(Unit\Model),EntityZ(Unit\Model))
                                        PositionEntity SelectUnitSprite,EntityX(Unit\Model),tY+.1,EntityZ(Unit\Model)
                                        max#=Unit\ModelWidth#
                                        If Max#>Unit\ModelDepth#  Then max#=Unit\ModelDepth#
                                        ScaleSprite SelectUnitSprite,max#,max#
                                        ShowEntity SelectUnitSprite       
                                        NewInterface.TInterface=First TInterface
                        StartDraw
                                        SetBlend FI_ALPHABLEND       
                                        DrawImageEx Unit\Avatar ,NewInterface\AvatarX,NewInterface\AvatarY
                                        DrawImageEx Unit\Icon ,NewInterface\IconX,NewInterface\IconY
                                EndDraw       
                                        UnitHealth(Unit\MaxHealth,Unit\NowHealth,ProjectedX#(),ProjectedY#(),True)
                                        Return 0
                                        EndIf
                    EndIf       
            EndIf       
    Next                   
    HideEntity SelectUnitSprite
    Return 0
End Function

Function UnitHealth(MaxHealth,NowHealth,Unit_X,Unit_Y,Viseble)

  If Viseble=True
         
  mxh=((MaxHealth/10)/4)
 
  If NowHealth/10=MaxHealth/10 Or NowHealth/10>= ((mxh*3)) Then Color 0,255,0
 
  If  NowHealth/10>= ((mxh*2)) And NowHealth/10<((mxh*3)) Then Color 255,255,0
  If  NowHealth/10<= ((mxh*2)) Then Color 0,255,0
 
        ;Color 255,0,0
        Rect Unit_X-(MaxHealth/10)/2,Unit_Y,MaxHealth/10,6,0
        Rect Unit_X-(MaxHealth/10)/2,Unit_Y,NowHealth/10,6,1
        Color 255,255,255
    Return 0
  EndIf 
 
  Return 0
End Function


moka 28.05.2007 04:34

Re: Как узнать размер меша?
 
http://www.boolean.name/showthread.php?t=3610
;)

HolyDel 28.05.2007 11:53

Re: Как узнать размер меша?
 
черт, как я сразу недопер.
ведь функция возвращает хендл пикнутого ентити и етот хендл несовпадает с хендлом родителя. надо проверять нет ли ентити с таким хендлом среди детей.
Код:

function IsMyChild(ent,child)
for i=1 to countchildren(ent)
ismychild(ent,child)
next
if ent=child then itistrue=1 ; itistrue - глобальная переменная
end function
короче обнуляеш переменную, вызываеш ф-ию и потом смотриш значение перменной.


WaReZ_MEN 29.05.2007 01:42

Re: Как узнать размер меша?
 
HolyDel спасибо но МоКа тебя опередил и с этим :)


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

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