[ Обновленные темы · Новые сообщения · Участники · Поиск · RSS ]
Результаты поиска
AlexBond
Админы
Сообщений: 1042
Реп: 106 / Инв: 8
Зачем создавать велосипед? Ищите в сети готовую модель системника с проводами и импортируйте через 3DImport. С текстурами, лично я бы справился, и менять растягивание тоже можно. короче вопрос не в идеи вопрос в реализации =)

ИМХО нет ничего невозможного, есть ленность и слабость =)


 
AlexBond
Админы
Сообщений: 1042
Реп: 106 / Инв: 8
Quote (firsacho)
Что за OGLE??

Ты не знаешь OGLE? это же мега вещь!!!! =)

OGLE найти можно тут http://ogle.eyebeamresearch.org/
Работает это так, после установки OGLE (час мучался пока понял как ее ставить =) ) жмем горячую клавишу, во время игры, и у нас сохраняется все что на экране в файл obj который открывается в 3DSMAX там ненужное выкидывается и сохраняется в формат 3ds, после чего импортируем в формат xom =)
Покажу скриншоты как это работает:

Forts делаем 3D Screenshot

Отыкрываем в 3DSMAX редактируем и разбиваем

Конвертируем в W3DEditor

Красим и Любуемся произведением искусства =)


 
AlexBond
Админы
Сообщений: 1042
Реп: 106 / Инв: 8
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

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


 
AlexBond
Админы
Сообщений: 1042
Реп: 106 / Инв: 8
Уважаю за принципиальность сам принципиальный и поэтому страдаю часто =)
Конечно если ты хочешь создать что-то новое и оригинальное, то плагиат это зло.
Но когда речь идет о тысячах поверхностей, о сотнях объектах, к примеру Статуя Свободы, то моделировать ее с нуля, идиотизм полнейший, хотя признаюсь вся нижнаяя часть, т.е. то на чем она стоит, я моделировал с нуля =) (верхнюю часть же просто разбивал вручную время много ушло, но я доволен!!! Удовольствие от созерцания результата важнее убитого времени ))
Мотоцикл тоже создавать с нуля было бы глупо, да и это все проверочные карты были, надо было посмотреть на возможности нового инструмента.

Что касается карты системника, то я бы не играл на такой, скучно там же везде платы плоские, никакой свободы нету... провода, еще зацепиться можно... Но смотря какой системник =)
ОПА у меня появилась идея!!!!! хочу карту из МАТРИЦЫ всю зеленую в иероглифах, надо только текстурку найти подходящую... =)


 
AlexBond
Админы
Сообщений: 1042
Реп: 106 / Инв: 8
Для W3D скрипт функции комнды такой
Code
function SetupWormsAndTeams()

     WormIndex = 0
     TeamIndex = 0

     GM = QueryContainer("GM.GameInitData")

     if GM.NumberOfTeams>=1 then   
        SetupTeam(GM.T1_Name, GM.T1_NumOfWorms, GM.T1_W1_Name, GM.T1_W2_Name, GM.T1_W3_Name, GM.T1_W4_Name, GM.T1_W5_Name, GM.T1_W6_Name,
                 GM.T1_Skill, GM.T1_Grave, GM.T1_Flag, GM.T1_Speech, GM.T1_IsLocal, GM.T1_AlliedGroup)
     end    
     if GM.NumberOfTeams>=2 then   
        SetupTeam(GM.T2_Name, GM.T2_NumOfWorms, GM.T2_W1_Name, GM.T2_W2_Name, GM.T2_W3_Name, GM.T2_W4_Name, GM.T2_W5_Name, GM.T2_W6_Name,
                 GM.T2_Skill, GM.T2_Grave, GM.T2_Flag, GM.T2_Speech, GM.T2_IsLocal, GM.T2_AlliedGroup)
     end
     if GM.NumberOfTeams>=3 then   
        SetupTeam(GM.T3_Name, GM.T3_NumOfWorms, GM.T3_W1_Name, GM.T3_W2_Name, GM.T3_W3_Name, GM.T3_W4_Name, GM.T3_W5_Name, GM.T3_W6_Name,
                 GM.T3_Skill, GM.T3_Grave, GM.T3_Flag, GM.T3_Speech, GM.T3_IsLocal, GM.T3_AlliedGroup)
     end    
     if GM.NumberOfTeams>=4 then   
        SetupTeam(GM.T4_Name, GM.T4_NumOfWorms, GM.T4_W1_Name, GM.T4_W2_Name, GM.T4_W3_Name, GM.T4_W4_Name, GM.T4_W5_Name, GM.T4_W6_Name,
                 GM.T4_Skill, GM.T4_Grave, GM.T4_Flag, GM.T4_Speech, GM.T4_IsLocal, GM.T4_AlliedGroup)
     end

      SendMessage("WormManager.Reinitialise")
end

, для W4 смотрите че у вас, походу должно быть похожее. Как я понял надо заменить функцию SetupTeam
Code
function SetupTeam(TeamName, NumWorms, Worm1Name, Worm2Name, Worm3Name, Worm4Name, Worm5Name, Worm6Name,
                    Skill, Grave, Flag, Speech, IsLocal, AlliedGroup)

    local lock, team

    lock, team = EditContainer(GetTeamContainerName(TeamIndex))  
    team.Active = true
    team.Name = TeamName
    team.TeamColour = 0
    team.Skill = Skill
    team.GraveIndex = Grave
    team.FlagGfxName = Flag
    team.AlliedGroup = AlliedGroup
    team.IsLocal = IsLocal
    if Skill>0 then
       team.IsAIControlled = true
    else
       team.IsAIControlled = false
    end

    -- PC: added this to reset the win count for the teams if this is the first round played.
    local iRounds = GetData("GameOver.RoundNumber")
    if iRounds == 0  
    then  
  team.RoundsWon = 0
    end

    CloseContainer(lock) -- must close the container ASAP

    if NumWorms>=1 then  
       SetupWorm(Worm1Name, Speech)  
    end    
    if NumWorms>=2 then  
       SetupWorm(Worm2Name, Speech)  
    end
    if NumWorms>=3 then  
       SetupWorm(Worm3Name, Speech)  
    end
    if NumWorms>=4 then  
       SetupWorm(Worm4Name, Speech)  
    end
    if NumWorms>=5 then  
       SetupWorm(Worm5Name, Speech)  
    end
    if NumWorms>=6 then  
       SetupWorm(Worm6Name, Speech)  
    end

    -- set the inventory
    --CopyContainer("Inventory.Team.Default", GetTeamInventoryName(TeamIndex))

    --SetSpecialWeapon(TeamIndex, SWeapon)
    TeamIndex = TeamIndex+1

end

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

Вот все возможные ячейки червей

Code

function GetWormContainerName(Id)

     local DataId = { "Worm.Data00", "Worm.Data01", "Worm.Data02", "Worm.Data03",
                      "Worm.Data04", "Worm.Data05", "Worm.Data06", "Worm.Data07",
                      "Worm.Data08", "Worm.Data09", "Worm.Data10", "Worm.Data11",
                      "Worm.Data12", "Worm.Data13", "Worm.Data14", "Worm.Data15",
                      "Worm.Data16", "Worm.Data17", ""}

, как мы видем их всего 18!!! И болльше сделать неудасться, по крайне мере в W3D, может в W4 можно добавить контейнеры, но даю 90% что нельзя.


 
AlexBond
Админы
Сообщений: 1042
Реп: 106 / Инв: 8
Короче исследовав эти файлы я понял что отличаются они лишь тремя контейнерами

W4 имеет:
XColor4ubSet

WF имеет:
XLightingEnable
XMeshDescriptor

В остальном структура файла шапки полностью одинаковая.
Задача в удалении лишних контейнеров и добавлении нужных, чтобы получить 100% совместимость...


 
AlexBond
Админы
Сообщений: 1042
Реп: 106 / Инв: 8
можно, но вопрос в том что там таблица индексов для треугльников другая... я не понял какая, пытаюсь раскодировать...

3DS import работает =)

Осталось вытащить правильно шляпы...

Прикрепления: 1821186.jpg (102.6 Kb)


 
AlexBond
Админы
Сообщений: 1042
Реп: 106 / Инв: 8
Короче облом с шапками ((((((
3DScreenshot некоректно сохроняет текстурные координаты...

А таблица индексов в WF ЕВРЕЙСКАЯ я ее не понимаю и не пойму,

Code

00  00  00  DD  03  08  00  08
00  07  00  06  00  47  00  46
00  48  00  01  00  01  00  46
00  02  00  02  00  06  00  06
00  06  00  08  00  09  00  0A
00  0B  00  0B  00  09  00  09
00  09  00  0B  00  0C  00  0D
00  0E  00  0F  00  0F  00  10
00  0E  00  11  00  05  00  03
00  02  00  00  00  01  00  01
00  13  00  13  00  13  00  14
00  12  00  15  00  49  00  50
00  51  00  53  00  52  00  20
00  4D  00  1B  00  4E  00  1A
00  54  00  54  00  16  00  16
00  13  00  17  00  14  00  1E
00  1C  00  21  00  1D  00  1D
00  1A  00  1A  00  18  00  1B
00  19  00  20  00  1F  00  21
00  21  00  1E  00  1F  00  17
00  19  00  16  00  18  00  18
00  14  00  14  00  14  00  1C
00  15  00  1D  00  1D  00  1A
00  1A  00  1A  00  22  00  18
00  23  00  16  00  24  00  13
00  12  00  12  00  26  00  26
00  26  00  27  00  25  00  28
00  57  00  5F  00  60  00  60
00  2C  00  2C  00  2C  00  2F
00  30  00  5D  00  5E  00  5C
00  5C  00  28  00  28  00  28
00  31  00  27  00  33  00  29
00  34  00  2B  00  35  00  2D
00  36  00  2E  00  37  00  37
00  31  00  31  00  31  00  32
00  28  00  5F  00  5F  00  38
00  38  00  38  00  3A  00  39
00  3C  00  3B  00  78  00  78
00  3E  00  3E  00  3E  00  3F
00  3D  00  70  00  71  00  74
00  75  00  75  00  40  00  40
00  40  00  41  00  42  00  44
00  6A  00  73  00  7A  00  7A
00  41  00  41  00  41  00  43
00  44  00  45  00  45  00  49
00  49  00  49  00  12  00  4A
00  56  00  4C  00  55  00  4E
00  54  00  54  00  49  00  49
00  4A  00  4B  00  4C  00  4D
00  4E  00  4E  00  15  00  15
00  15  00  4F  00  50  00  53
00  53  00  49  00  49  00  51
00  4B  00  52  00  4D  00  4D
00  25  00  25  00  25  00  57
00  58  00  59  00  5A  00  5A
00  58  00  58  00  58  00  5A
00  5B  00  5C  00  5D  00  5D
00  64  00  64  00  66  00  65
00  67  00  6F  00  72  00  76
00  77  00  77  00  66  00  66
00  66  00  67  00  68  00  69
00  69  00  6C  00  6C  00  6D
00  6B  00  6E  00  6E  00  79
00  79  00  3C  00  78  00  78
00  7B  00  7B  00  7B  00  6A
00  7A  00  7A  00  7C  00  7C
00  7E  00  7D  00  83  00  80
00  82  00  81  00  85  00  84
00  94  00  81  00  93  00  80
00  92  00  7D  00  91  00  7C
00  90  00  7F  00  7F  00  7C
00  7E  00  7E  00  86  00  86
00  86  00  87  00  88  00  8C
00  9B  00  9D  00  9E  00  9C
00  9A  00  9A  00  89  00  89
00  89  00  8A  00  8B  00  8D
00  99  00  98  00  96  00  96
00  89  00  89  00  89  00  8B
00  8C  00  9C  00  9D  00  9D
00  8C  00  8C  00  8C  00  87
00  89  00  89  00  8E  00  8E
00  8E  00  86  00  88  00  88
00  99  00  99  00  99  00  96
00  9A  00  9E  00  9E  00  A0
00  A0  00  A1  00  9F  00  A2
00  A2  00  A4  00  A4  00  A5
00  A3  00  A6  00  A6  00  A8
00  A8  00  A9  00  A7  00  AA
00  AA  00  AC  00  AC  00  AD
00  AB  00  AE  00  AE  00  B0
00  B0  00  B1  00  AF  00  B2
00  B2  00  B4  00  B4  00  B5
00  B3  00  B6  00  B6  00  B8
00  B8  00  B9  00  B7  00  BA
00  BA  00  BC  00  BC  00  BD
00  BB  00  BE  00  BE  00  BF
00  BF  00  C0  00  C1  00  C5
00  C6  00  C7  00  C8  00  CD
00  C2  00  CA  00  BF  00  C9
00  C9  00  C2  00  C2  00  BF
00  C1  00  C1  00  C0  00  C0
00  C0  00  C3  00  C4  00  C9
00  CA  00  CA  00  C5  00  C5
00  C5  00  C0  00  C4  00  C4
00  CB  00  CB  00  CB  00  CC
00  CD  00  D0  00  CA  00  CE
00  C4  00  CF  00  CF  00  C7
00  C7  00  CB  00  CD  00  CD
00  11  00  11  00  11  00  10
00  03  00  04  00  00  00  00
00  57  00  57  00  57  00  60
00  59  00  61  00  5A  00  62
00  5C  00  63  00  5E  00  37
00  30  00  2E  00  2C  00  2D
00  2A  00  2B  00  26  00  29
00  27  00  27  00  02  00  02
00  02  00  95  00  05  00  0C
00  0E  00  0E  00  9B  00  9B
00  9B  00  9E  00  97  00  96
00  8E  00  8F  00  86  00   

По ней у треугольника вершины (8,8,7) (6,47,46) (48,1,1) (46,2,2) (6,6,6) ... т.е. получается абсурд, треугольник из двух и трех одинаковых вершин, это уже отрезок или точка... индексы должны быть разными, а тут они одинаковые, и так во всех файлах WF. TEAM17 евреи!!!!!! или же Индусы =) короче у них все через жопу написано, это еще k^2 мне коворил, когда объяснял формат покселя....

Так что, Nezon, забей на это дело, если конечно тебе не влом самому налаживать текстуры =)

Проблемы:
1. Невозможно понять структуру таблицы индексов WF. Т.е. мы имеет все вертексы 3D модели, имеет текстуру и координаты. но мы не имеем правильной таблицы треугольников...
2. 3DScreenshot не сохранает текстуры, т.е. у нас есть таблица треугольников, есть вертексы, но нету текстурных координат...

Короче я умываю руки на время сессии, сдам все экзамены, тогда может че и решу, а так забей...

Прикрепления: 4115701.png (107.3 Kb)


 
AlexBond
Админы
Сообщений: 1042
Реп: 106 / Инв: 8
Решил поэксперементировать... И что я обнаружил, создать одну команду из 8 червей впролне реально, но 9 на 9 не получается... Да и толку нет, я обнаружил другое!!! Можно создать CPU_TEAM которая будет играть онлайн, вот это будет прикольно, т.к. иногда попросту нехватает играков, а CPU в онлайн не добавишь обычными методами....

Реинкорнация.
Пока еще не знаю чем врубать эту опцию, наверно поставлю на вормпот, а пока что я научился реинкорнировать червя =)
ВЕЩЬ!!!!!!
Убитый червь вновь оживает, причем становиться на свободное поле, надо еще подумать куда всунуть эту опцию, но опция СУПЕРСКАЯ!!! cool Даже если убита вся команда и игра не окончена, то реинкорнировавший червь продолжает играть за команду!

Поставлю наверно эту опцию на землетряску, у нас там шаман в бубен бьет, прикольно будет biggrin


 
AlexBond
Админы
Сообщений: 1042
Реп: 106 / Инв: 8
А за себя голосовать можно? =) Что касается Картоделанья то я делал не так много карт
Из них ручная работа была :
3D Labyrinth
Chess
Cocons
Cubos
Death Staff
Mountains
Psyduck Island - модель утки
Sahara
Snooker
Spiders - паутина , я ее синусами рисовал в Exel
Stars
Underground

Статуя свободы весь низ - ручная работа

Счас делаю Южный парк =)


 
AlexBond
Админы
Сообщений: 1042
Реп: 106 / Инв: 8
Quote (firsacho)
Да... за дни и ночи щелканья по клавиатуре, за месяцы работы над кодом, за полное самоотвержение и фанатичное посвещение себя червякам

Медаль тебе за такие слова!!! =)

Моник у меня и так окошечко 22". Да и как правильно выразился SW_Krash я это все делаю из-за удовольствия от самого процесса, жаль что нету "психов" в помощь, так бы быстрее дело шло, а то все в одиночку... мануал писал вчера... морока ужасная... но доделаю я ее, раз взялся...

А так спасибо за медаль без названия =)


 
AlexBond
Админы
Сообщений: 1042
Реп: 106 / Инв: 8
Я переделал из 2 скаченых с нета моделей, свою в соответсвии с пропорциями мультика, в итоге получилось "канфетка" =)

Счас думаю над дизайном.

Quote (Герыч)
что это значит???

Это значит что в редакторе v1.0 чтобы регулировать слои нужно было вставлять таблицу данных, а таблицу с данными я заполнял через Excel ну а функцию полукруга я взял sin. Кстати снукер тоже так делался, ножки стола - это синус в квадрате что-ли.


 
AlexBond
Админы
Сообщений: 1042
Реп: 106 / Инв: 8
Ну это уже сам делай для w4, если надо модель Шефа могу дать, а вот автобус и машину делать мне влом, мне для w3d хватит и этого:


 
AlexBond
Админы
Сообщений: 1042
Реп: 106 / Инв: 8
Для тех кто не может дождаться мануала, хотя в принципе его и читать мало кто будет. Я все таки создам топик.

Итак - текстура в покслельном исполнении - это блок, состоящий из 5 текстур. Первая отвечает за верх, вторая за боковушки, третья за низ, четвертая за грани, пятая за внутринний низ.

Чтобы создать свою текстуру, нужно загрузить текстурный лист (шаблон). Загрузить в память текстуры. Выбрать номер блока. Поменять текстуры в блоке можно лишь перетаскиванием из Текстурного окна. Название блока меняется контекстным меню.

Блок создан, но текстуры лежат крыво?

Нам нужно зайти в панель Текстурных координат.

Code
0.250000    0.000000    0.000000    0.000000
0.000000    0.250000    0.150000    0.000000
-0.200000    0.000000    0.250000    0.000000
0.000000    0.00000 0    0.000000    0.000000

мы имеем следующую матрицу по умолчанию. Как она работает я до сих пор не понял =)
Знаю лишь одно, методом проб и ошибок можно узнать какая координата за что отвечает.
Изменять координаты нужно через консольное меню.

Герыч может ты мне объяснишь как они устроены, я когда делал редактор, то я ТУПО перебирал координаты, пока не получил нужный эффект =) Теорию до сих пор не знаю.

Но матрицу представляю так (Мировые координаты):

Code
x    x+    x+z    z+x
z+    z    xy    x+y
zy    y+x    y    y+z
x+    z+    y+x    y+z

Пороюсь может найду свои записи по этому делу...


 
AlexBond
Админы
Сообщений: 1042
Реп: 106 / Инв: 8
есть новости интересные k^2 был замечен на BlameThePixel
Last active: 18725 minutes ago (that's 13.003 days)
Если он ответит на мое сообщение может поможет с шапками....


 
AlexBond
Админы
Сообщений: 1042
Реп: 106 / Инв: 8
У меня появилась идея как вставить новые текстуры в W4/W3D не причинаяя вреда другим .
Code
Итак:
A14 - возможно используется
A15
A60
A61 - нигде не упоминается
C18
C61 - нигде не упоминается
B05_08 - нигде не упоминается
B05_09 - нигде не упоминается

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

Может если поискать еще можно найти и больше, текстур которые не используются в игре....


 
AlexBond
Админы
Сообщений: 1042
Реп: 106 / Инв: 8
У меня тут появилась идея создать карту Matrix.
В ней намереваюсь создать такие сцены как Зал с колономи, Зеленую комнату, Вертолет стреляющий в небоскреб, крышу.

Короче думаю над тем нужны ли на карте персонажи, типа уклоняющийся от пуль Нео, или нафиг нужен =) Можно даже сделать червяков, но это много работы... Карту намереваюсь делать вручную, с текстурами проблема конечно, но попробую сначало стандартные.

Как вам идея?

P.S. Проблема еще в том, карту делаю пока для W3D, чтобы карта была в W4 надо опять же подбирать текстуры...

Прикрепления: 7790315.jpg (97.9 Kb)


 
AlexBond
Админы
Сообщений: 1042
Реп: 106 / Инв: 8
Полюбому текстуру придется вставлять, стандартную никак не приспособишь.

Я нашел вот такую


и такую

А вот с моделью Нео, это надо модельера искать =) Или пытаться стырить с игры Path of Neo тока врятли получится....


 
AlexBond
Админы
Сообщений: 1042
Реп: 106 / Инв: 8
У меня уже кое что получилось =) выглядит круто, я заменил W3D текстуру, и заодно разгадал ее код
Там текстура в формате MultiMap, т.е.
256x256, 128x128, 64x64, 32x32, 16x16, 8x8, 4x4, 2x2, 1x1
Пришлось создавать все 9 текстур и вставлять в код =)
В итоге получилось то что надо!

Правда сглажка мне не очень нравиться в W3D но пойдет =)

--
Темновато немного... (((


 
AlexBond
Админы
Сообщений: 1042
Реп: 106 / Инв: 8
Немного осветлил...


 
Поиск: