forum.boolean.name

forum.boolean.name (http://forum.boolean.name/index.php)
-   Xors3D (http://forum.boolean.name/forumdisplay.php?f=126)
-   -   xLine3D - нужна ф-я (http://forum.boolean.name/showthread.php?t=13197)

fadalist 24.08.2010 15:03

xLine3D - нужна ф-я
 
Здравствуйте. Читаю мануал по Xors3d 1.14 26 Jun 2009, там была такая ф-я. Почему убрали такую полезную функцию, и возможно ли её добавить в следующих релизах?

xLine3D ( int x1, int y1, int z1, int x2, int y2, int z2, int red, int green, int blue, int alpha, bool zenable = true )

Либо подскажите как можно нарисовать линию между двумя движущимися Entity. Пытаюсь использовать динамически создаваемые меши.

Global laser =xCreateMesh()
xEntityOrder(laser,1)
Global LasSurf = xCreateSurface(laser, 0)

xAddVertex(LasSurf, -1, -1, 0)
xAddVertex(LasSurf, -1, 1, 0)
xAddVertex(LasSurf, 1, 1, 0)
xAddVertex(LasSurf, 1, -1, 0)

xAddTriangle(LasSurf, 0, 1, 2)
xAddTriangle(LasSurf, 0, 2, 3)

Затем в цикле меняю координаты вершин:
xVertexCoords(LasSurf, 0, xEntityX(ship\Ent), xEntityY(ship\Ent), xEntityZ(ship\Ent))
xVertexCoords(LasSurf, 1, xEntityX(ship\Ent), xEntityY(ship\Ent)+1, xEntityZ(ship\Ent))
xVertexCoords(LasSurf, 2, xEntityX(ship\Target), xEntityY(ship\Target), xEntityZ(ship\Target))
xVertexCoords(LasSurf, 3, xEntityX(ship\Target), xEntityY(ship\Target)+1, xEntityZ(ship\Target))
xUpdateNormals(laser)

Получается, сложно и не очень хорошо.

ABTOMAT 24.08.2010 16:07

Ответ: xLine3D - нужна ф-я
 
xCameraProject спроецирует координаты из 3Д в 2Д. А дальше уже просто xLine

HolyDel 24.08.2010 16:29

Ответ: xLine3D - нужна ф-я
 
ABT,а с zenable что делать будешь?

fadalist 24.08.2010 16:39

Ответ: xLine3D - нужна ф-я
 
Да была мысль 2Д линией воспользоваться, но как заметил HolyDel, проблемка будет. Представляете 2 корабля стреляют друг по другу, а вместо лазеров линия от центра одного до центра другого, не очень красиво будет :)

Сейчас сделал так, корявенько конечно. Но работает.

Global laser = xCreateCube(ship\Ent)
xScaleEntity(laser, 0.1,0.1, 100)
xPositionEntity(laser, 0,0,100)

создает лазер в виде куба и прикрепляется к родителю (кораблю)
далее в цикле

If xMeshesIntersect(laser, tar) = True Then
dist# = xEntityDistance(ship\Ent, tar)
xScaleEntity(laser, 0.1, 0.1, dist/2)
xPositionEntity(laser, 0, 0, dist/2)
Else
xScaleEntity(laser, 0.1, 0.1, 100)
xPositionEntity(laser, 0,0,100)
EndIf

оно конечно работает, но линия было бы всё равно не плохо, да и точки в 3д не помешали бы...

.Squid 25.08.2010 15:26

Ответ: xLine3D - нужна ф-я
 
Имхо, вместо 3д-линии для лазера лучше использовать спрайт с текстурой. xLine3D создавалась для отображения различной debug-информации.

Mr_F_ 25.08.2010 15:39

Ответ: xLine3D - нужна ф-я
 
и была в этом плане весьма удобна, особенно когда я тестил порталы и физику. так что верните, хуле

fadalist 25.08.2010 17:45

Ответ: xLine3D - нужна ф-я
 
Я пока выкрутился из ситуации описанным выше способом. Использовать спрайты я не пробовал, но думаю придется голову поломать на какой угол его повернуть. С Z буфером можно выкрутится с помощью xEntityOrder с положительным значением. И ещё со спрайтом не работают шейдеры, хотя по сути это же полигон (2 треугольника). Если использовать поверхности, шейдеры работают, но придется плюсом к проблеме со спрайтом ещё голову поломать как его ориентировать на камеру.

HolyDel 25.08.2010 21:14

Ответ: xLine3D - нужна ф-я
 
спрайт не всегда полигон. на уровне гапи по крайней мере есть так называемые точечные спрайты. когда текстура натягивается на точку.

мое имхо - если ты делаешь космические бои, где лазеры - основное оружие, то над ним надо попотеть. делай цилиндром каким нибудь. или даже несколькими цилиндрами друг в друга вложенными. етож почти основной эффект в твоей игре, не?

ABTOMAT 25.08.2010 21:32

Ответ: xLine3D - нужна ф-я
 
Цитата:

делай цилиндром каким нибудь. или даже несколькими цилиндрами друг в друга вложенными.
Оу, щи! Да чем вам растянутый квад с текстурой не угодил?
А для дебага функция нужна. Запилите как выпилили!

fadalist 25.08.2010 23:05

Ответ: xLine3D - нужна ф-я
 
Про точечные спрайты не слышал, надо почитать что за звери такие :super:
Сейчас растянутыми квадратами и оставил, видели бы вы какое дуло летало пока масштаб не подобрал :crazy:

Кстати может подскажете как ориентировать эти квадраты одной стороной на камеру? Чтобы текстура по нормальному ложилась.

И может кому интересно чем я тут маюсь, прямо сюда можно архивчик выложить?

HolyDel 25.08.2010 23:15

Ответ: xLine3D - нужна ф-я
 
векторное произведение знаешь что за штука?

грубо говоря тебе надо умножить вектор, который идет от центра луча до одного его конца, на вектор, который идет из камеры на конец.
нормализуешь его и домножаешь на 1/2 ширины луча.
далее получаешь две точки, одну - прибавив етот вектор к концу - вторую вычев его из конца.
ну и с началом луча такая же история.
это типа алгоритм, я мог перепутать в некоторых местах вычитание или сложение или порядок, но сам алгоритм примерно такой.

и отключи backface culling, чтобы не мучаться с порядко вершин.

fadalist 28.08.2010 11:15

Ответ: xLine3D - нужна ф-я
 
Спасибо, буду разбираться.

.Squid 28.08.2010 15:41

Ответ: xLine3D - нужна ф-я
 
У спрайта есть несколько режимов отображения. См. документацию Modules -> Constants -> Sprite view modes

fadalist 10.03.2011 23:40

Ответ: xLine3D - нужна ф-я
 
Эх забросил я свою поделку на долгие месяцы. Но мужики спасибо добавили всё таки xCreate3DLine :)


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

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