W3DEditor 2.2 готов, но не выпущен...
|
|
Сообщений: 1042
|
Опубликовано: 04.01.2009, 05:57:48
Дело в том, что т.к. меня задолбали все своими вопросами =) Я пишу туториал прямо в Мануале, проблема в том что пишу его на агнлийском, в нем около 30 скриншотов, и этим размер релиза увеличится сильно... Но это еще не все, я хочу написать так же туториал как импортировать 3DS файлы, потому как это охринительно сложно объяснить, в качестве примера покажу как в 3DSMAX и Blender разбиваются модели для того чтобы импорт был качественный, все это занимает ужасно много времени, и делать мне это ужасно влом =) Да еще и к сессии готовлюсь, Вот и получается прогу написал, а выпустить не могу... Я бы писал мануал на русском, но это еще дольше, ведь английский он КОМАНДНЫЙ язык, а русский литературный, больше букв Короче ждите если вообще кто ждет, а я пока делаю крутые карты, ибо это мне не влом, а в кайф =)
|
|
|
|
Сообщений: 3813
|
Опубликовано: 04.01.2009, 11:40:44
Иисус велел делиться... Хрен с ним с туториалом, выпустишь потом W3dEditor 2.2 noob edition. А я хотеть делать крутые карты уже сейчас!... Все равно никто по-англицки туториал не внюхнет.
Смысл жизни в том, чтобы жизнь имела смысл... (firsacho 2005) Рай придуман, чтобы не страшно было умирать. Ад придуман, чтобы не страшно было жить. (firsacho 2007) Мир делиться на два типа людей: Бездарные трудоголики и Талантливые лентяи. (firsacho 2008)
mod.worms.pro - мод Worms Renewation для Worms4
|
|
|
|
Сообщений: 519
|
Опубликовано: 04.01.2009, 13:05:36
да согласен, плюс туториалы почти никто не читает, лучше бы видео туториал )) но все равно выпускай уже)
|
|
|
|
Сообщений: 1240
|
Опубликовано: 04.01.2009, 16:21:43
Выпускай без туториала! тока для меня версию без мультитекстур скомпилируй))
________________________ __|____|____|____|____|__ |____|____|____|____|____| __|___бицца головой___|__ |____|____|сюда|____|____| __|____|____|____|____|__ |____|____|____|____|____|
|
|
|
|
Сообщений: 1042
|
Опубликовано: 04.01.2009, 18:13:07
Ладно уговорили, только надо помощь ваша, появились новые строки, и их надо перевести на русский мне было в лом это делать, и все вопросы возникшие с редактором задавайте тут, а счас перечислю что он может нового: - Создавать эммитеры с нуля - Перемещает без ГЛЮКОВ эмиттеры - Обрезает поксельный объект по высоте - Заменяет текстуры по слоям - Функция Blur делает сглаживание мультитекстур без глюков, ее нажимать надо когда все уже готово, и изменений не будет. - Летать камерой использую клавишу S вперед и X назад. - Выделять много покселей используя клавишу Ctrl и потом удалять их одинм махом или делать группу из них, чтобы можно было перемещать. - Убран глюк с именами - таблица строк была глючная - Сохранять поксель в формате *.vox для других редакторов, если надо сделать типа форму, или просто сделать резервную копию, на случай удаления лишних вокселей, потом ее загружать можно. - Убран глюк с Vista/XP SIZE - некоторые умники используют маштабирование окон, и мой редактор глючил у них сильно, поэтому пришлось вырубить маштабирование редактора. - 3DS EXPORT Можно Сохранять всю карту вместе с текстурами в формате *.3ds (незнаю зачем, но мне было удобно в 3DSMAX открыть карту и добавлять объекты, которые я потом импортировал в редактор) - 3DS IMPORT Можно импортировать 3d модель, в формате 3ds. ВажнО!!!!! Модель должна быть максимально разбита на простейшие, модель не должна содержать источники света и камеры разные. Редактор автоматом разбивает объекты которые не имеют общих точек, т.е. если у вас рука, то не нужно каждый палец отделять, можно просто отделить 1,3,5 и 2,4. Т.е. имея 2 объекта редактор сам разделит не соединенные. Каждый отдельный объект будет преобразован в поксель, количество слоев указывается в опциях, чем больше тем качественнее, автосглаживание слоев уменьшает их где они не нужны, к примеру для ящика достаточно 2-х слоев, а не 26, да и игра много слоев не выдержит. Сглаживание слоев регулируется переменной ее надо выставлять в зависемости от желаемого результата. Так же в 3DSMAX есть опция Export Selected которую я использую для частей модели которые плохо получились, чтобы не импортировать модель целиком, можно разбить лишь эту часть. Пример: У нас человечек, после импорта у него получились плохие руки и голова, мы разбиваем руки по пальцам, а голову по мелким частям (нос, ухи, глаза, губы) и загружаем их, старые куски удаляем, в итоге не тратиться время для просчетов при импорте. Короче все это дело не сложное, к примеру когда я разбивал этого T-Rex я сначало загрузил модель, посмотрел на нее, и разбил череп, ребра и грудь на более мелкие куски, в итоге получилось Офигенно круто. Импортируемый объект имеет текстуру #1 чтобы заменить ее на #21, нужно в Replacer написать (Dummy=False) (Texture=1>>21) Или же в панели изменения размеров покселей ставить номер текстуры, и нажимать приминить, так удобно отдельные куски красить. Ну вроде бы все. Пишите вопросы, добавлю их в мануал, для нубов =) Видео туториал делать влом, так как и скриншотный =) Но думаю сделаю потом.
|
|
|
|
Сообщений: 3813
|
Опубликовано: 04.01.2009, 18:18:33
Крутые функции) многое как раз из того, чего сильно не хватало) особенно респект за создание эммиторов с нуля, ну а про 3ds тут блин даж не знаю как выразить восторг, слов таких нет чтоб сказать на сколько это охренительно.
Смысл жизни в том, чтобы жизнь имела смысл... (firsacho 2005) Рай придуман, чтобы не страшно было умирать. Ад придуман, чтобы не страшно было жить. (firsacho 2007) Мир делиться на два типа людей: Бездарные трудоголики и Талантливые лентяи. (firsacho 2008)
mod.worms.pro - мод Worms Renewation для Worms4
|
|
|
|
Сообщений: 1042
|
Опубликовано: 04.01.2009, 18:20:01
[mnuTreeAddemitter]=Add Emitter [mnuGroupPoxelSelected]=poxels secected [mnuGroupDeletePoxels]=Delete Poxels [mnuGroupGroupPoxels]=Group Poxels [mnuMainFileImport3ds]=Import 3ds... [mnuMainFileExport3ds]=Export to 3ds... [mnuMainViewShow3Dmodel]=Show 3D Model [ImportForm]=Import 3D Model [ImportFormOptions]=Options [ImportFormDegroup]=Degroup [ImportFormPoxelSizeX]=Poxel Size X [ImportFormPoxelSizeZ]=Poxel Size Z [ImportFormMaxLayers]=Max Layers [ImportFormLayersSmooth]=Layers Smooth [ImportFormQLayersSmooth]=Quality Layers Smooth [sCancel]=Cancel [sOpen...]=Open... [sDefault]=Default [mnuTreeInfo]=[%d] poxels have [%d] voxels [sSave]=Save [sSave...]=Save... [ExportForm]=Export 3D Model [ExportFormSelectModel]=Select Model [ExportFormFullMap]=Full Map [ExportFormTextures]=Textures (*.tga) переведите плиз =) Сделаю релиз =)
|
|
|
|
Сообщений: 3813
|
Опубликовано: 04.01.2009, 18:35:45
[mnuTreeAddemitter]=Добавить эммитор [mnuGroupPoxelSelected]=выбрано покселей [mnuGroupDeletePoxels]=Удалить поксели [mnuGroupGroupPoxels]=Сгруппировать поксели [mnuMainFileImport3ds]=Импорт из 3ds... [mnuMainFileExport3ds]=Експорт в 3ds... [mnuMainViewShow3Dmodel]=Показать трехмерную модель [ImportForm] =Импортировать трехмерную модель [ImportFormOptions] =Опции [ImportFormDegroup] =Разгрупировать [ImportFormPoxelSizeX] =Размер покселя по оси X [ImportFormPoxelSizeZ] =Размер покселя по оси Z [ImportFormMaxLayers] = Максимальное количество слоев [ImportFormLayersSmooth] =Сглаживание слоя [ImportFormQLayersSmooth] =Качество сглаживания слоя [sCancel] =Отмена [sOpen...] =Открыть... [sDefault] =По умолчанию [mnuTreeInfo] = [%d] покселей, имеют [%d] вокселей [sSave] =Сохранить [sSave...] =Сохранить... [ExportForm] =Експортировать трехмерную модель [ExportFormSelectModel] =Выбрать модель [ExportFormFullMap] =Целая карта [ExportFormTextures] =Текстуры (*.tga)
Смысл жизни в том, чтобы жизнь имела смысл... (firsacho 2005) Рай придуман, чтобы не страшно было умирать. Ад придуман, чтобы не страшно было жить. (firsacho 2007) Мир делиться на два типа людей: Бездарные трудоголики и Талантливые лентяи. (firsacho 2008)
mod.worms.pro - мод Worms Renewation для Worms4
|
|
|
|
Сообщений: 1042
|
Опубликовано: 04.01.2009, 18:54:10
Глюк..... Пришлось сократить перевод, не влазил.
|
|
|
|
Сообщений: 1042
|
Опубликовано: 04.01.2009, 19:21:07
Ловите!!!!!! http://w4tweaks.ucoz.ru/load/5-1-0-123
|
|
|
|
Сообщений: 19
|
Опубликовано: 07.01.2009, 00:54:11
Хотелось бы чтобы он сам 3ds резал, т.к. это занимает... ну... несколько дней - хороший объект. У динозавра я думаю пришлось каждый зуб отделять, а кости на несколько частей делить? Был бы боьшой плюс, повторю: БОЛЬШОЙ ПЛЮС, если бы он мог делать сам разрезку объекта)))
|
|
|
|
Сообщений: 1042
|
Опубликовано: 08.01.2009, 00:29:45
Quote (Nezon) БОЛЬШОЙ ПЛЮС, если бы он мог делать сам разрезку объекта))) Просто привиду пример альфа версии резалки Code if GroupMode then begin {$IFDEF GROUPON} Process := 1; // ищем точки - центры внутринних стержней поверхностей for i := 0 to Count3dsFace - 1 do begin Import3DModel.ProgressMain.Position := Round(i / Count3dsFace * 10); Import3DModel.ProgressPoxel.Position := i; if RunThread.Terminated then Exit; //face 1 p0a := GetXYZfPoint(i, 0); p0b := GetXYZfPoint(i, 1); p0c := GetXYZfPoint(i, 2); GetSegment(p0a, p0b, p0c, p1, p2, MaxLength); // находим отрезок из // центра треугольника по нормали внутрь с длинной Max lastface := -1; LenMin := MaxLength; // Import3DModel.PoxelProcess.Caption:='Finding Div Points'; // Import3DModel.ProgressPoxel.Position:=0; // Import3DModel.ProgressPoxel.Max:=Count3dsFace; for k := 0 to Count3dsFace - 1 do begin // Import3DModel.ProgressPoxel.Position:=k; // face 2 pa := GetXYZfPoint(k, 0); pb := GetXYZfPoint(k, 1); pc := GetXYZfPoint(k, 2); // находим пересечение отрезка с треугольником // причем минимальное! if (k <> i) and LineFace(p1, p2, pa, pb, pc, p) and (GetLength(p1, p) < LenMin) then begin p2 := p; lastface := k; LenMin := GetLength(p1, p2); end; end; // если найден такой треугольник, то if lastface<>-1 then begin // Array3DSPoints[i].Join:=-1; Array3DSPoints[i].Active := true; Array3DSPoints[i].p := GetDivPoint(p1, p2); // Array3DSPoints[i].face:=i; Array3DSPoints[i].Radius := GetLength(Array3DSPoints[i].p, p1); //inc(IndexPoint); end; end; Process := 2; // ищем радиусы от точек до ближних поверхностей ShowRadius := 0; Import3DModel.PoxelProcess.Caption := 'Finding Radius and Smooth Points'; Import3DModel.ProgressPoxel.Position := 0; Import3DModel.ProgressPoxel.Max := Count3dsFace; for i := 0 to Count3dsFace - 1 do if Array3DSPoints[i].Active then begin MinRadius := Array3DSPoints[i].Radius; Import3DModel.ProgressMain.Position := 10 + Round(i / Count3dsFace * 30); Import3DModel.ProgressPoxel.Position := i; // теперь находим радиус точки for r := 0 to Count3dsFace - 1 do begin // Import3DModel.ProgressPoxel.Position:=r; pa := GetXYZfPoint(r, 0); pb := GetXYZfPoint(r, 1); pc := GetXYZfPoint(r, 2); Radius := GetRadius(Array3DSPoints[i].p, pa, pb, pc, MinRadius, p); if Radius < MinRadius then MinRadius := Radius; end; Array3DSPoints[i].Radius := MinRadius; ShowRadius := i;
{ end; //итак у нас имеется массив точек, нужно уменьшить этот массив // так чтобы у нас получились лишь конкретные точки. // можно соединить все ближние по радиусу, уменьшим размер массива // Radius:= LenMax*0.2; // итак мысль вторая: сферическое сглаживание: берем точку находи ее радиус // такой что сфера вписывается в фигуру, т.е. минимальное растояние от точки // до плоскости // все точки вошедшие в сферу центрируем центром масс ноходим новую сферу // двигаем первую точку в центр, а остальные делаем не активными, оставив ссылку // на активную точку. Process := 3; // убераем все ближние точки входящие в радиус Import3DModel.PoxelProcess.Caption := 'Smooth Points'; Import3DModel.ProgressPoxel.Position := 0; Import3DModel.ProgressPoxel.Max := Count3dsFace; for i := 0 to Count3dsFace - 1 do begin } found := false; SumX := Array3DSPoints[i].p.x; SumY := Array3DSPoints[i].p.y; SumZ := Array3DSPoints[i].p.z; Sum := 1; // Import3DModel.ProgressPoxel.Position := i; // Import3DModel.ProgressMain.Position := 30 + Round(i / Count3dsFace * 10); // if RunThread.Terminated then // Exit; // Import3DModel.ProgressPoxel.Position:=0; // Import3DModel.ProgressPoxel.Max:=IndexPoint; if Array3DSPoints[i].Active then for k := 0 to Count3dsFace - 1 do begin // Import3DModel.ProgressPoxel.Position:=k; ShowRadius := i; if Array3DSPoints[k].Active and (k <> i) and (GetLength(Array3DSPoints[i].p, Array3DSPoints[k].p) < Array3DSPoints[i].Radius) then begin found := true; Array3DSPoints[k].Active := false; Array3DSPoints[k].Join := i; SumX := SumX + Array3DSPoints[k].p.x; SumY := SumY + Array3DSPoints[k].p.y; SumZ := SumZ + Array3DSPoints[k].p.z; Sum := Sum + 1; // Radius:=GetLength(Array3DSPoints[i].p,Array3DSPoints[k].p); end; end; if found then begin Array3DSPoints[i].p.x := SumX / Sum; Array3DSPoints[i].p.y := SumY / Sum; Array3DSPoints[i].p.z := SumZ / Sum; end; // end;
end; // Далее создаем лучевые множества, из каждой точки к каждому элементу, // при этом проверяем чтобы луч не пересекал треугольники // после сканирования всех точек, подсчитываем минимальные вхождения // затем из минимаьлных вхождений создаем множества, такие // чтобы начало множества не входило в следующее // получаем минимум множеств, эти минимумы и будут отсеченные элементы Process := 4; // создаем матрицу соединений Import3DModel.PoxelProcess.Caption := 'Joins Points'; Import3DModel.ProgressPoxel.Position := 0; Import3DModel.ProgressPoxel.Max := Count3dsFace; FoundMax := 1; FoundMin := Count3dsFace; ShowJoin := 0; // создадим матрицу из проверочных битов размером в inxexPoint x indexPoint SetLength(MatrixJoin, 0,0); { SetLength(MatrixJoin, Count3dsFace); for i := 0 to Count3dsFace - 1 do SetLength(MatrixJoin[i], Count3dsFace); } SetLength(MatrixJoin,Count3dsFace,Count3dsFace); IndexSet := 0;
for i := 0 to Count3dsFace - 1 do begin Import3DModel.ProgressPoxel.Position := i; Import3DModel.ProgressMain.Position := 50 + Round(i / Count3dsFace * 35); if RunThread.Terminated then Exit; FoundNum := 0; ShowJoin := i; if Array3DSPoints[i].Active then for j := i + 1 to Count3dsFace - 1 do if Array3DSPoints[j].Active and (GetLength(Array3DSPoints[i].p, Array3DSPoints[j].p) < Array3DSPoints[i].Radius * 5) then begin for r := 0 to Count3dsFace - 1 do begin pa := GetXYZfPoint(r, 0); pb := GetXYZfPoint(r, 1); pc := GetXYZfPoint(r, 2); if LineFace(Array3DSPoints[i].p, Array3DSPoints[j].p, pa, pb, pc, p) then Break; end; if r = Count3dsFace then begin MatrixJoin[i][j] := 1; Array3DSPoints[j].ShowJoin := i; Inc(FoundNum); end; IfMinMax(FoundMin,FoundMax,FoundNum); { if FoundNum > FoundMax then FoundMax := FoundNum; if FoundNum < FoundMin then FoundMin := FoundNum; } Array3DSPoints[i].Num := FoundNum; Inc(IndexSet); end; end; if IndexSet = 0 then begin //Process := 7; //Exit; IndexSet := 1 end; SetLength(ArraySet, 0); SetLength(ArraySet, IndexSet); IndexSet := 0; // Import3DModel.PoxelProcess.Caption:='Joins Points'; Import3DModel.ProgressPoxel.Position := 0; Import3DModel.ProgressPoxel.Max := Count3dsFace; Process := 5; // соединяем все ближние точки по матрице for i := 0 to Count3dsFace - 1 do if Array3DSPoints[i].Active then begin FoundNum := 0; for j := i + 1 to Count3dsFace - 1 do if MatrixJoin[i][j] = 1 then Inc(FoundNum); for j := 0 to i - 1 do if MatrixJoin[j][i] = 1 then Inc(FoundNum); if FoundNum = 0 then begin //*************************************** for j := i + 1 to Count3dsFace - 1 do if Array3DSPoints[j].Active then begin Import3DModel.ProgressPoxel.Position := i; Import3DModel.ProgressMain.Position := 85 + Round(i / Count3dsFace * 5); ShowJoin := i; for r := 0 to Count3dsFace - 1 do begin pa := GetXYZfPoint(r, 0); pb := GetXYZfPoint(r, 1); pc := GetXYZfPoint(r, 2); if LineFace(Array3DSPoints[i].p, Array3DSPoints[j].p, pa, pb, pc, p) then Break; end; if r = Count3dsFace then begin MatrixJoin[i][j] := 1; Array3DSPoints[j].ShowJoin := i; Inc(FoundNum); end; end //*************************** end; { if FoundNum > FoundMax then FoundMax := FoundNum; if FoundNum < FoundMin then FoundMin := FoundNum; } IfMinMax(FoundMin,FoundMax,FoundNum); Array3DSPoints[i].Num := FoundNum;
ArraySet[IndexSet] := i; Inc(IndexSet); end; Process := 6; // сортируем массив множеств и назначаем группы
for I := 0 to IndexSet - 2 do for J := IndexSet - 1 downto I + 1 do if Array3DSPoints[ArraySet[I]].Num < Array3DSPoints[ArraySet[j]].Num then begin T := ArraySet[I]; ArraySet[I] := ArraySet[J]; ArraySet[J] := T; end;
Import3DModel.PoxelProcess.Caption := 'Grouping'; Import3DModel.ProgressPoxel.Position := 0; Import3DModel.ProgressPoxel.Max := IndexSet; Group := 0; for r := IndexSet - 1 downto 0 do if Array3DSPoints[ArraySet[r]].Active and (Array3DSPoints[ArraySet[r]].Group = 0) then begin Import3DModel.ProgressPoxel.Position := IndexSet - r; Import3DModel.ProgressMain.Position := 90 + Round((IndexSet - r) / Count3dsFace * 5); i := ArraySet[r];
if (Array3DSPoints[i].Num = 0) then begin Inc(Group); Array3DSPoints[i].Group := Group; end else //if (Array3DSPoints[ArraySet[r]].Num>10) then begin Inc(Group); Array3DSPoints[i].Group := Group; GetJoinsPoint(i, Group); end; end; // увеличиваем множество, с проверкой по радиусу.
for i := 0 to Count3dsFace - 1 do if not Array3DSPoints[i].Active then Array3DSPoints[i].Group := Array3DSPoints[Array3DSPoints[i].Join].Group;
// теперь нам нужно из кучи множеств собрать лишь такие множества // которые будут иметь минимальное количество элементов // и не иметь головы множества другого множества, иначе эти // множества можно слаживать. // сложив минимальные множества мы получим минимум множеств Process := 7; // группировка мелких групп Import3DModel.PoxelProcess.Caption := 'Group Points'; Import3DModel.ProgressPoxel.Position := 0; Import3DModel.ProgressPoxel.Max := Group; for i := 0 to Group - 1 do begin Import3DModel.ProgressPoxel.Position := i; Import3DModel.ProgressMain.Position := 95 + Round(i / Group * 5); found := false; SumX := 0; SumY := 0; SumZ := 0; Sum := 0; if RunThread.Terminated then Exit;
for k := 0 to Count3dsFace - 1 do if Array3DSPoints[k].Active and (Array3DSPoints[k].Group = i) then begin //(GetLength(Array3DSPoints[i].p,Array3DSPoints[k].p)<Array3DSPoints[i].Radius) then if not found then begin j := k; end else begin Array3DSPoints[k].Active := false; Array3DSPoints[k].Join := j; end; SumX := SumX + Array3DSPoints[k].p.x; SumY := SumY + Array3DSPoints[k].p.y; SumZ := SumZ + Array3DSPoints[k].p.z; Sum := Sum + 1; found := true; end; if found then begin Array3DSPoints[j].p.x := SumX / Sum; Array3DSPoints[j].p.y := SumY / Sum; Array3DSPoints[j].p.z := SumZ / Sum; end; end;
// найдем все группы, посчитаем их количество, присвоим num // найдем самые маленькие num и соединим между собой пока они не // не достингут установленного предела.
FoundMax := 1; FoundMin := Count3dsFace; SetLength(ArraySet, 0); IndexSet := Group; SetLength(ArraySet, IndexSet); for i := 0 to Group - 1 do begin for k := 0 to Count3dsFace - 1 do if Array3DSPoints[k].Active and (Array3DSPoints[k].Group = i) then begin j := k; FoundNum := 1; Break; end;
for k := 0 to Count3dsFace - 1 do if not Array3DSPoints[k].Active and (Array3DSPoints[k].Group = i) then Inc(FoundNum);
IfMinMax(FoundMin,FoundMax,FoundNum); { if FoundNum > FoundMax then FoundMax := FoundNum; if FoundNum < FoundMin then FoundMin := FoundNum; } Array3DSPoints[j].Num := FoundNum; ArraySet[i] := j; end; // Очищем матрицу соединений { for i := 0 to Count3dsFace - 1 do for j := 0 to Count3dsFace - 1 do MatrixJoin[i][j] := 0; } SetLength(MatrixJoin, 0,0); SetLength(MatrixJoin,Count3dsFace,Count3dsFace);
// сканируем по поверхностям, если треугольник соединяется поверхностью // то получаем элемент. Группы соединяем поэлементно // если треугольник группы не соединен с остальными, убираем его из группы // таким образом мы получим замкнутые блоки // сканирование очень простое, берем все треугольники группы, составляем матрицу // соединений - сверяем индекс точки с индексами точек сверяемого треугольника. // всего 9 сравнений // находим максимальные соединения // делим группу на элементы. // отбрасываем минимальный элемент. // присоединяем минимальный элемент к группе с которой он соединяется. for i := 0 to Count3dsFace - 1 do for j := i + 1 to Count3dsFace - 1 do begin if (MatrixJoin[i, j] = 0) and TestFaceConnect(i, j) then begin MatrixJoin[i][j] := 1; Inc(Array3DSPoints[i].NumJoins); Inc(Array3DSPoints[j].NumJoins); end; end; // можно создать матрицу граней // для единичной поверхности имеет три свободные грани. // нужно отделить и соеденить с ближними. // MatrixJoin[0][0]:=0;
// сортируем массив { for I := 0 to IndexSet - 2 do for J := IndexSet-1 downto I + 1 do if Array3DSPoints[ArraySet[I]].Num <Array3DSPoints[ArraySet[j]].Num then begin T := ArraySet[I]; ArraySet[I] := ArraySet[J]; ArraySet[J] := T; end; }
///начиная с минимальных групп ведем сканирование, и соединяем их с максимальными группами for i := 0 to 5 do //for r:=0 to Group-1 do //for j:=IndexSet-1 downto 0 do begin // r - группа индекс ее // ArraySet[r] - индекс центра группы // бемем группу и сканируем каждый ее элемент // отделяем элемен и присоединяем к другой группе // r:=Array3DSPoints[ArraySet[j]].Group; // // r:=j; for k := 0 to Count3dsFace - 1 do // if (Array3DSPoints[k].Group=r) then begin // сканируем элемент k // находи все плоскости соединяющиеся с ним FoundNum := GetMaxJoinsFaceGroup(k, Array3DSPoints[k].Group); if FoundNum < 2// or (Array3DSPoints[k].NumJoins<3) then begin Array3DSPoints[k].Group := FindNearGroup(k, Array3DSPoints[k].Group); // inc(Array3DSPoints[k].NumJoins); end; // проверяем и считаем количество соединений с главной группой // если соединение слабое // соединяем с другой максимальной группой. end; // if Array3DSPoints[ArraySet[r]].Active // end;
// Конец дегруппирования IndxGroup:=1; GroupArray:=nil; SetLength(GroupArray,Group); // Если есть группы for k := 0 to Count3dsFace - 1 do if GroupArray[Array3DSPoints[k].Group]=0 then begin GroupArray[Array3DSPoints[k].Group]:=IndxGroup; inc(IndxGroup); // создаем для групп dummy poxel Name_Groups // берем каждую группу и преобразуем в поксель // Array3DSPoints[k].Group := end;
MaxVert:=Length(Obj3D.PointsArr); SetLength(ConvertTable,MaxVert);
for g:=1 to IndxGroup-1 do begin PoxObj3D.Name:=Format('%s_SubGroup_%d',[Obj3D.Name,g]); // PoxObj3D.PointsArr:=Obj3D.PointsArr; PoxObj3D.FaceArr:=nil; SetLength(PoxObj3D.FaceArr,Count3dsFace); // инициализируем конверт таблицу for i:=0 to MaxVert-1 do ConvertTable[i]:=-1;
j:=0; k:=0; for i:=0 to Count3dsFace-1 do if (GroupArray[Array3DSPoints[i].Group]=g) then begin // берем лицо из этой группы // ObjArray3D[ArrayIndex].FaceArr[j]:=Obj3D.FaceArr[i]; PoxObj3D.FaceArr[j]:=Obj3D.FaceArr[i]; // копируем его в группу по индексу for n:=0 to 2 do // заполняем таблицу конверта if ConvertTable[Obj3D.FaceArr[i][n]]=-1 then begin // назначаем новый номер поверхности ConvertTable[Obj3D.FaceArr[i][n]]:=k; PoxObj3D.FaceArr[j][n]:=k; inc(k); end else // назначаем назначеный номер поверхности PoxObj3D.FaceArr[j][n]:=ConvertTable[Obj3D.FaceArr[i][n]];
inc(j); // Import3DModel.ProgressPoxel.Position := 60+Round(i / FaceCount_3DS * 20); end; SetLength(PoxObj3D.FaceArr,j); // обрезаем поверхности SetLength(PoxObj3D.PointsArr,k); // обрезаем точки
for i:=0 to k-1 do // копирование точек for j:=0 to MaxVert-1 do if ConvertTable[j]=i then PoxObj3D.PointsArr[i]:=Obj3D.PointsArr[j];
GetPoxProperties(PoxObj3D,Poxel); PoxObj3D.PointsArr:=nil; PoxObj3D.FaceArr:=nil; if RunThread.Terminated then Exit; end; {$ENDIF} end // GroupMode Это резалка о которой ты говорил, я ее писал месяц гдето, но в итоге она даже пингвина не смога разрезать на лапы, крылья и хвост, поэтому я отказался от этого, кто хочет пусть свою напишет, я не возражаю
|
|
|
|
Сообщений: 3813
|
Опубликовано: 08.01.2009, 11:21:48
было бы круто сделать в мап едиторе готовые приметивы (круг, шар, конус, пирамида) и библиотеку простейших объектов, которую можно будет пополнять самостоятельно, и подлючать файлы с библиотеками, как кисти в фотошопе...
Смысл жизни в том, чтобы жизнь имела смысл... (firsacho 2005) Рай придуман, чтобы не страшно было умирать. Ад придуман, чтобы не страшно было жить. (firsacho 2007) Мир делиться на два типа людей: Бездарные трудоголики и Талантливые лентяи. (firsacho 2008)
mod.worms.pro - мод Worms Renewation для Worms4
|
|
|
|
Сообщений: 519
|
Опубликовано: 08.01.2009, 12:46:53
Ага круто) ну что, W3DMapEditor v2.3 xDD
|
|
|
|
Сообщений: 1042
|
Опубликовано: 07.03.2009, 22:59:41
Люди у меня вопрос, писать мануал по Реплейсеру, или хватит лишь пару базовых функций? Я знаю что мануал врятли кто читает, но все же, там есть скрины которые иногда помогают понять непонятное.
|
|
|
|
Сообщений: 1240
|
Опубликовано: 08.03.2009, 00:11:19
я считаю по чему мануал нужен, так это по реплайсеру! пиши!
________________________ __|____|____|____|____|__ |____|____|____|____|____| __|___бицца головой___|__ |____|____|сюда|____|____| __|____|____|____|____|__ |____|____|____|____|____|
|
|
|
|