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 06.11.2011 19:06

Разделить мир на квады
 
Вложений: 1
Захотел я сделать что-нибудь прикольное связанное с экономикой.Например свой зоопарк.
Мне нужно разделить каку-либо плоскость на квадраты и чтобы я в любом таком квадратике мог поставить какой-либо объект.
Каким образом это можно провернуть?
Вложение 15369

NitE 06.11.2011 19:09

Ответ: Разделить мир на квады
 
1. Создаешь массив 20х20.
2. ??????
3. профит!

Program23 06.11.2011 19:19

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

Program23 06.11.2011 19:42

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

Dim box(20,20)
For 
x1 To 10
 
For y1 To 10
 
box
(x,y)=CreateCube()
ScaleEntity box(x,y),2,2,.2
xf
#=xf#+4
PositionEntity box(x,y),xf#,0,0
EntityColor box(x,y),Rnd(0,255),255,255

Next
 Next 

Что-то не могу понять,как сделать поле.Получается только по осиX

dsd 06.11.2011 19:46

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

Dim box(20,20)
For x= 1 To 10
 For y= 1 To 10
 
box(x,y)=CreateCube()
ScaleEntity box(x,y),2,2,.2


PositionEntity box(x,y),xf#,yf#, 0
EntityColor box(x,y),Rnd(0,255),255,255
yf#=yf#+4
Next
xf#=xf#+4
 Next

Кстати почему массив на 400 элементов, а расставляются только 100? Не вижу логики :D

Program23 06.11.2011 20:00

Все разобрался.
А как удалить пост?у меня нет такой кнопки

Сделал возможность выделять квадратики,уже прогресс.

Кирпи4 06.11.2011 20:53

Ответ: Разделить мир на квады
 
А почему бы не сделать только два триангла на ячейку вместо целого квада? ИМХО, полигонаж сократится ровно в 6 раз

Program23 06.11.2011 21:11

Ответ: Разделить мир на квады
 
Вложений: 1
Если я правильно понял,то ты предлагаешь разделить один квадрат на 4.
Вложение 15374

Кирпи4 06.11.2011 21:15

Ответ: Разделить мир на квады
 
Нет, я предлогаю вместо CreateCube() делать создание только ОДНОГО сурфейса. Да и вообще, тук-тук в аську: 371074970

Mr_F_ 06.11.2011 21:30

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

А почему бы не сделать только два триангла на ячейку вместо целого квада?
ваще то квадами обычно и называют плоские квадраты из двух трианглов

Кирпи4 06.11.2011 21:36

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

Сообщение от Mr_F_ (Сообщение 208633)
ваще то квадами обычно и называют плоские квадраты из двух трианглов

Тфу блин, спасибо, я просто постоянно их путаю

Program23 06.11.2011 21:49

Ответ: Разделить мир на квады
 
Такс...создал я квад
PHP код:

mesh CreateMesh() 
surf CreateSurface(mesh

v0 AddVertex (surf, -5,-5,0,0
v1 AddVertex (surf5,-5,0,0
v2 AddVertex (surf, -55,00.5,1)

t0 AddVertex (surf5,-5,0,0
t1 AddVertex (surf5,5,0,0
t2 AddVertex (surf, -55,00.5,1

tri AddTriangle (surf,v0,v2,v1)
tri2 AddTriangle (surf,t0,t2,t1

Пикать его PickedSurface или PickedEntity?

ABTOMAT 06.11.2011 22:01

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

Сообщение от Program23 (Сообщение 208637)
Такс...создал я квад
PHP код:

mesh CreateMesh() 
surf CreateSurface(mesh

v0 AddVertex (surf, -5,-5,0,0
v1 AddVertex (surf5,-5,0,0
v2 AddVertex (surf, -55,00.5,1)

t0 AddVertex (surf5,-5,0,0
t1 AddVertex (surf5,5,0,0
t2 AddVertex (surf, -55,00.5,1

tri AddTriangle (surf,v0,v2,v1)
tri2 AddTriangle (surf,t0,t2,t1

Пикать его PickedSurface или PickedEntity?

Если они у тебя каждый в отдельном Entity (скорее всего с твоим кодом оно так и есть), то PickedEntity, если в одном Entity, но в разных сурфейсах, то PickedSurface. А вообще лучше б их все в один сурфейс загнать и по пикнутому трианглу определять, к какой ячейке оно относится.

Program23 07.11.2011 09:32

Ответ: Разделить мир на квады
 
Сделал все,как посоветовал АВТОМАТ.
Как можно узнать позицию Triangle?

Randomize 07.11.2011 12:26

Ответ: Разделить мир на квады
 
Через
TriangleVertex ( surface,triangle_index,corner )

Получаем нужный vertex (0,1,2)

И далее:
VertexX# ( surface,index )
VertexY# ( surface,index )
VertexZ# ( surface,index )

По теме:
http://help.boolean.name/commands/3d...edTriangle.htm

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 объявлен вне функций как глобальный?

Program23 08.11.2011 20:15

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

Mr_F_ 08.11.2011 21:37

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

For a.Attracts=Each Attracts
If quadID<>a\Pick Then
CreateAttracts(EntityX#(over),EntityY#(over),quadI D)
EndIf
EndIf
а че тут endif вместо next в конце?

Program23 08.11.2011 21:52

Ответ: Разделить мир на квады
 
Потерялось при копировании.
Там между Endif'ами Next должен стоять.

Mr_F_ 09.11.2011 00:23

Ответ: Разделить мир на квады
 
значит ошибка где-то ещё (не в запощенном коде)

Program23 13.11.2011 13:43

Ответ: Разделить мир на квады
 
Я создал массив Dim CELL(10,10)
Теперь я создаю карту:
Код:

For x=1 to 10
For y=1 to 10
CELL(x,y)=CreateMap()
Next
Next

Теперь у меня есть поле,состоящее из клеток.
Мой ГГ появляется в ячейке CELL(1,1).
И когда я передвигаюсь ГГ'ем,мне нужно,чтобы на экране выводился номер той ячейки в которой ГГ в данный момент находится.

PHP код:

Например,в таком видеГГ находится в ЯЧЕЙКЕ (3,6


Mr_F_ 13.11.2011 15:12

Ответ: Разделить мир на квады
 
ну как проверить нахождение точки в квадрате ты же можешь догадаться?


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

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