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

Program23 07.11.2011 13:22

Ответ: Разделить мир на квады
 
Вложений: 1
Ура,готово.
Сделал,возможно можно было легче.
Код:

If (CameraPick(cam,MouseX(),MouseY()))<>0 Then

selected_ent=PickedTriangle ()
vertex=TriangleVertex ( surf,selected_ent,0 )
 xv=VertexX ( surf,vertex )
 yv=VertexY ( surf,vertex )
 zv=VertexZ( surf,vertex )
selected_ent2#=PickedTriangle ()
selestN=(selected_ent2#/2)

If (selected_ent/2)=selestN Then
PositionEntity selectOVER,xv+2.5,yv+2.5,zv
Else
PositionEntity selectOVER,xv-2.5,yv-2.5,zv
EndIf

Когда я ставил выделитель(selectOVER) на позицию выделенного в данный момент триангла, выделитель почему-то смещался.Я не смог решить эту проблему.
Но зато я обнаружил, что в кваде, состоящем из двух треугольников, первый из них имеет, делящийся на 2 - номер,а второй при делении на 2,имеет остаток.
Тогда,деля номер триангла на 2, я проверял,равен ли результат целому числу,если да,то позиция такая,если нет,то позиция другая.
Результат:
Вложение 15378

UPD
Создал карту размером 30x30 ячеек.
TrisRendered: 1313
ФПС стабильна,абсолютная безлаговость.

Program23 07.11.2011 14:39

Ответ: Разделить мир на квады
 
Новый трабл.
У меня есть тип:
Код:

Type Attracts (атракционы :D )
Field Types$      (Тип:Дорога,Атрракцион)
Field x#,y#
Field Model 
End Type

Вот пикаю я на карте в клетку и создается у меня объект дороги:
Код:

Function CreateAttracts.Attracts(x#,y#)
a.Attracts=New Attracts
 a\Model=CreateCube()
 a\Types="ROAD"
 a\x=x#
 a\y=y#

PositionEntity a\Model,a\x,a\y,-.001

  Return a
 End Function

Если я второй раз пикну в ту же клетку,там повторно создастя объект "Дорога". Каким образом предотвратить это?
Создать переменную a\picked=PickedTriangle() и потом проверять пикнутую в данный момент клетку со всеми объектами.Подскажите

ABTOMAT 07.11.2011 17:39

Ответ: Разделить мир на квады
 
Перед созданием нового объекта проверять, не существует ли он уже.
Можно например при создании записывать в объект номера принадлежащих ему полигонов.
При повторном пике поискать, нет ли где объекта с номером пикнутого триса. Если нет - то создавать новый.

Mr_F_ 07.11.2011 18:28

Ответ: Разделить мир на квады
 
Цитата:

Как можно узнать позицию Triangle?
у тебя же вроде регулярная сетка - зная последовательность трианглов можно узнать позицию сразу из номера.

типа если квады стоят так:

1 2 3
4 5 6

и каждый квад = 2 триангла (последовательно в памяти)

то как-то так:

quadID = triangleID / 2
quadX# = quadID Mod numQuadsX
quadY# = floor(quadID / float(numQuadsX))
quadX = quadX / numQuadsX
quadY = quadY / numQuadsY

posX# = lerp(minX,maxX,quadX)
posY# = lerp(minY,maxY,quadY)

Function lerp#(a#,b#,c#)
Return a#+c#*(b#-a#)
End Function

Reizel 07.11.2011 18:44

Ответ: Разделить мир на квады
 
6 вертексов на квад??? да вы извращенцы. Это ж тока в DX надо без индексного буфера :(

Program23 07.11.2011 20:19

Ответ: Разделить мир на квады
 
Цитата:

Сообщение от Павел (Сообщение 208732)
6 вертексов на квад??? да вы извращенцы. Это ж тока в DX надо без индексного буфера :(

Чего-чего?

Mr_F_ 07.11.2011 20:26

Ответ: Разделить мир на квады
 
для квада достаточно 4х вершин, ты создаёшь 6 (судя по посту №13)

Program23 07.11.2011 20:28

Ответ: Разделить мир на квады
 
А,тоесть можно как-то соединить четыре вертекса?
Можно поподробнее

Markova 07.11.2011 20:52

Ответ: Разделить мир на квады
 
Ну как то так
PHP код:

v0=AddVertex(s,-4,0,4,0,0)
v1=AddVertex(s,4,0,4,1,0)
v2=AddVertex(s,4,0,-4,1,1)
v3=AddVertex(s,-4,0,-4,0,1)
AddTriangle(s,v0,v1,v2)
AddTriangle(s,v0,v2,v3


Program23 07.11.2011 20:52

Ответ: Разделить мир на квады
 
Точно,что-то я туплю

Program23 07.11.2011 20:54

Ответ: Разделить мир на квады
 
О,я нашел классную библиотеку по квадам.
http://blitzetc.blitzmax.ru/index.ph...QuadLibrary.bb

Program23 08.11.2011 13:55

Ответ: Разделить мир на квады
 
Код:

quadID=PickedTriangle()/2

For a.Attracts=Each Attracts
If quadID<>a\Pick Then
CreateAttracts(EntityX#(over),EntityY#(over),quadID)
EndIf

Почему-то не получается сравнивать ID квадов.

Mr_F_ 08.11.2011 14:46

Ответ: Разделить мир на квады
 
a\Pick чему равен? запости полный код пика

Program23 08.11.2011 16:03

Ответ: Разделить мир на квады
 
У меня там еще в коде ко-что,счетчик CountEnt.
Код:

If MouseHit(1)=True Then
quadID=PickedTriangle()/2

If CountEnt<=0 Then CreateAttracts(EntityX#(over),EntityY#(over),quadID)

If CountEnt>0 Then

For a.Attracts=Each Attracts
 If quadID<>a\Pick Then
 CreateAttracts(EntityX#(over),EntityY#(over),quadID)
 EndIf
Next
EndIf

Функция CreateAttracts:
Код:

Function CreateAttracts.Attracts(x#,y#,Pick)
CountEnt=CountEnt+1

a.Attracts=New Attracts
a\Model=CreateMesh()
surfa = CreateSurface(a\Model)

QuadAdd(surfa,2.5,2.5)

a\Pick=Pick
a\Types="ROAD"
a\x=x#
a\y=y#

PositionEntity a\Model,a\x,a\y,-.001

Return a
End Function

Следовательно, a\Pick=quadID

Mr_F_ 08.11.2011 17:15

Ответ: Разделить мир на квады
 
CountEnt объявлен вне функций как глобальный?


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

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