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)

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, а то в противных случаях придеться еще и радиус или коробку задавать.


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

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