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

moka 04.07.2011 14:40

Ответ: Имитация водной поверхности.
 
Код:

mul(float4((IN.Position.xyz * float3(1.0,1.0,0.5)),IN.Position.w),MatWorld).
Писал в броузере.

dsd 04.07.2011 20:32

Ответ: Имитация водной поверхности.
 
Рисую няньку гг, вроде ниче такая получается :-D

Другой ракурс с теселяцией :)

Mr_F_ 04.07.2011 21:08

Ответ: Имитация водной поверхности.
 
настолько недоделанные меши лучше не показывать. что ты хочешь о них услышать то?

moka 04.07.2011 21:11

Ответ: Имитация водной поверхности.
 
Лучше кодь, а модельки дай другим поделать или скачай с онлайна..

Reks888 04.07.2011 21:11

Ответ: Имитация водной поверхности.
 
Славу гнома хочет
Глаза то кул

dsd 04.07.2011 21:26

Ответ: Имитация водной поверхности.
 
Господа, мой код еще страшней моих моделек. Но сиськи как живые вроде :-D

Mr_F_ 04.07.2011 21:35

Ответ: Имитация водной поверхности.
 
Цитата:

Но сиськи как живые вроде
не. в кучку как-то собраны, в реале они должны больше в стороны быть направлены.
сверху ещё у тебя типа шов между ними, в реале там его практически нет (потому что они оттуда как бы расти начинают).
http://thumbs.dreamstime.com/thumbla...6161b3U3Kx.jpg

ключиц я тоже чет не вижу у него.

dsd 04.07.2011 21:40

Ответ: Имитация водной поверхности.
 
Вы мне еще скажите, что у мну аватарка каким-то детсадовцем вылеплена

moka 04.07.2011 21:44

Ответ: Имитация водной поверхности.
 
Аватарка - норма, а вот моделька - гомосятская.. :D
Код лучше..

dsd 04.07.2011 21:47

Ответ: Имитация водной поверхности.
 
Ага, значит красивые сиськи, а какая будет жопа, ммм... Имхо, в модели для игр жопа должна быть красивой, ибо перед глазами все время :-D

Mr_F_ 04.07.2011 22:07

Ответ: Имитация водной поверхности.
 
Цитата:

Вы мне еще скажите, что у мну аватарка каким-то детсадовцем вылеплена
рот, глаза кривые.
аналогично с набровными дугами. нос великоват тоже.
че у него сверху между рогами - непонятно, как и то, что с боков торчит.

dsd 04.07.2011 22:53

Ответ: Имитация водной поверхности.
 



А по моему для шойдерных перверсий в хорсе пойдет уже :)

Кому нинада не качайте :-D

NitE 04.07.2011 23:31

Ответ: Имитация водной поверхности.
 
Аватарка тобой вылеплена ?
В модели слишком много полигонов. Развернутое мнение по поводу модели в спойлере, очень не рекомендую читать если не терпишь критики.

.
.
.
.
.
Лучше уничтожь свою модель и все упоминания о ней. Она годится разве что психику детям колечить, перманентно. Я во время трапезы пролистывал форум, так еда чуть не оказалась на прежнем месте, когда увидел твою модельку. Реально, даже слово не подобрать. Это просто кал. Говно без права на существование. Ни о какой аргументированной критике и речи быть не может. И что за бред с названием ? Какая на*уй нянька гг ? Я думаю, что твои недавние опасения насчет старческой деменций вполне обоснованны.

Я предупреждал, ок.

dsd 04.07.2011 23:34

Ответ: Имитация водной поверхности.
 
Nite, тесселяцию вырубать пробовал?

А мне нравица :-D

Хм... аватарка не моя, тут ребенок под ногами крутился трехлетний, кусок пластилина об пол мял получилось это... Честно.

HolyDel 04.07.2011 23:37

Ответ: Имитация водной поверхности.
 
если бы у меня была такая нянька - я бы был заикой

NitE 04.07.2011 23:38

Ответ: Имитация водной поверхности.
 
Я модельку не качал и не буду, я про то что на скринах.

dsd 04.07.2011 23:40

Ответ: Имитация водной поверхности.
 
Ну и что, что кал, но это еще будет калинку-малинку танцевать в моем мега D-тайтле :)

Mr_F_ 05.07.2011 00:02

Ответ: Имитация водной поверхности.
 
Цитата:

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

dsd 05.07.2011 16:33

Ответ: Имитация водной поверхности.
 


Правильно ли я нашел уравнения клипплейнов для камеры в её координатах?
левый X+Z=0
правый X-Z=0
верхний Y-2Z=0
Нижний Y+2Z=0
Или углы другие?

Если в модели будет больше вершин чем нужно в 4 раза, при том же количестве полигонов и их положении в пространстве. То для видеокарты в принципе разницы между первой и второй моделью почти нет?

dsd 05.07.2011 22:42

Ответ: Имитация водной поверхности.
 
Код:

Include "xors3d.bb"
Global pivot,camera,mxs#,mys#,Light,ball,camera1

Dim ScreenData#(5,3)

xGraphics3D(800,600, 32,0, 0)

pivot=xCreatePivot()
camera1 = xCreateCamera(pivot)
camera=xCreateCamera(camera1)
xRotateEntity camera,90,0,0
xCameraProjMode camera,0
light = xCreateLight()


;debufcam=xCreateCamera(camera)
;xPositionEntity debufcam,0,0,50
;xCameraViewport debufcam,0,0,300,300
;xPointEntity debufcam,camera
debufcam2=xCreateCamera(camera1)
xPositionEntity debufcam2,0,50,0
xCameraViewport debufcam2,200,0,200,200
xPointEntity debufcam2,camera1

lefttop=xCreateCube()
xEntityColor lefttop,255,0,0
leftdown=xCopyEntity(lefttop)
righttop=xCopyEntity(lefttop)
rightdown=xCopyEntity(lefttop)
center=xCopyEntity(lefttop)


For i=0 To 50
gg=xCreateCube()
xPositionEntity gg,Rnd(0,50),0,Rnd(0,50)
Next

While(Not (xKeyHit(KEY_ESCAPE) Or xWinMessage("WM_CLOSE")))
MindMassage()

xPositionEntity leftdown,ScreenData#(0,0),ScreenData#(0,1),ScreenData#(0,2)
xPositionEntity lefttop,ScreenData#(1,0),ScreenData#(1,1),ScreenData#(1,2)
xPositionEntity righttop,ScreenData#(2,0),ScreenData#(2,1),ScreenData#(2,2)
xPositionEntity rightdown,ScreenData#(3,0),ScreenData#(3,1),ScreenData#(3,2)
xPositionEntity center,ScreenData#(4,0),ScreenData#(4,1),ScreenData#(4,2)

xUpdateWorld
xRenderWorld()
Control(0.1,1)
xText 10,50,ScreenData#(0,0)
xText 10,60,ScreenData#(0,1)
xText 10,70,ScreenData#(0,2)

xText 80,50,ScreenData#(1,0)
xText 80,60,ScreenData#(1,1)
xText 80,70,ScreenData#(1,2)

xText 160,50,ScreenData#(2,0)
xText 160,60,ScreenData#(2,1)
xText 160,70,ScreenData#(2,2)

xText 240,50,ScreenData#(3,0)
xText 240,60,ScreenData#(3,1)
xText 240,70,ScreenData#(3,2)

xText 320,50,ScreenData#(4,0)
xText 320,60,ScreenData#(4,1)
xText 320,70,ScreenData#(4,2)

        xFlip()
Wend

End


Function MindMassage()

xTFormVector 0,1,0,0,camera
a#=xTFormedX()
b#=xTFormedY()
c#=xTFormedZ()

xTFormPoint 0,0,0,0,camera
x1#=xTFormedX()
y1#=xTFormedY()
z1#=xTFormedZ()

d#=xEntityY(camera,1)

; ax+by+cz+d=0
;ищи левый нижний угол
;пересечение X=-z и Y=-2z
;подставляю в первое уравнение
;
Z00#=-D/(c-a-2*b)
X00#=-z00
Y00#=-2*z00
xTFormPoint x00,y00,z00,camera,0
ScreenData#(0,0)=xTFormedX()
ScreenData#(0,1)=xTFormedY()
ScreenData#(0,2)=xTFormedZ()

; ax+by+cz+d=0
;ищи левый верхний угол
;пересечение X=-z и Y=2z
;подставляю в первое уравнение
;
Z01#=-D/(c-a+2*b)
X01#=-z01
Y01#=2*z01
xTFormPoint x01,y01,z01,camera,0
ScreenData#(1,0)=xTFormedX()
ScreenData#(1,1)=xTFormedY()
ScreenData#(1,2)=xTFormedZ()

; ax+by+cz+d=0
;ищи правый верхний угол
;пересечение X=z и Y=2z
;подставляю в первое уравнение
;
Z11#=-D/(c+a+2*b)
X11#=z11
Y11#=2*z11
xTFormPoint x11,y11,z11,camera,0
ScreenData#(2,0)=xTFormedX()
ScreenData#(2,1)=xTFormedY()
ScreenData#(2,2)=xTFormedZ()

; ax+by+cz+d=0
;ищи правый нижний угол
;пересечение X=z и Y=-2z
;подставляю в первое уравнение
;
Z10#=-D/(c+a-2*b)
X10#=z10
Y10#=-2*z10
xTFormPoint x10,y10,z10,camera,0
ScreenData#(3,0)=xTFormedX()
ScreenData#(3,1)=xTFormedY()
ScreenData#(3,2)=xTFormedZ()

;ищи центр
xTFormPoint (x01+x10+x11+x00)/4,(y01+y10+y11+y00)/4,(z01+z10+z11+z00)/4,camera,0
ScreenData#(4,0)=xTFormedX()
ScreenData#(4,1)=xTFormedY()
ScreenData#(4,2)=xTFormedZ()

End Function

Function control(speed#,mousesensitivity#)
If xKeyDown(key_1) Then xWireframe(True) Else xWireframe(False)
        xText(10, 10, "FPS: " + xGetFPS())       
                xText(10,30,"Trisinview: "+xTrisRendered ())
mxs#=mxs#+(xMouseXSpeed()/5.0)
mys#=mys#+(xMouseYSpeed()/5.0)
xRotateEntity (camera1,mousesensitivity#*mys#,-mousesensitivity#*mxs#,0)
xMoveMouse xGraphicsWidth()/2,xGraphicsHeight()/2
If xKeyDown(17) Or xKeyDown(200) xMoveEntity camera1,0,0,speed#
If xKeyDown(31) Or xKeyDown(208) xMoveEntity camera1,0,0,-speed#
If xKeyDown(30) Or xKeyDown(203) xMoveEntity camera1,-speed#,0,0
If xKeyDown(32) Or xKeyDown(205) xMoveEntity camera1,speed#,0,0
xPositionEntity pivot,xEntityX#(camera1,1),xEntityY#(camera1,1),xEntityZ#(camera1,1)
xPositionEntity camera1,0,0,0
End Function

Люди, реально, какие углы у камеры? Кто-нибудь знает или нет?

moka 05.07.2011 22:42

Ответ: Имитация водной поверхности.
 
Матрицу нада юзать скорее всего а не углы..

dsd 05.07.2011 22:44

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

Сама матрица без исходных данных тут как-то бес толку.

Читал хелп, медитирую теперь на:
Цитата:

BBDECL void BBCALL xCameraProject2D ( Camera * camera,
int x,
int y,
float zDistance
)

Projects the 2D screen coordinates on to the world coordinates.

Parameters:
camera Camera handle
x Screen coordinate on X axis
y Screen coordinate on Y axis
zDistance Distance of the projected point from camera near plane
И на :
Цитата:

BBDECL D3DXMATRIX* BBCALL xGetProjectionMatrix ( Camera * camera )

Returns a pointer to camera's projection matrix.

Parameters:
camera Camera handle
Очень лаконичные пояснения команд :-D

.Squid 06.07.2011 01:45

Ответ: Имитация водной поверхности.
 
Для тех, кто знает, что такое projection matrix, описание вообще не надо. Остальным лучше вообще не трогать.

Вы вообще что пытаетесь сделать, уважаемый?

dsd 06.07.2011 02:20

Ответ: Имитация водной поверхности.
 
Освоить хорс тридэ. :)

А в данный момент, пытался нащупать четыре точки пересечения четырех комплектов трех плоскостей.(получилось почему то, что точки получаются сзади камеры, видимо с плоскостями формирующими пирамиду обзора накосячил, т.к. точки пересечения имеют y=0)

Xz из координат мира(тформенная в координаты камеры), левая боковая и нижняя клиплайны камеры, если не путаю терминологию, чтобы получить соответствующую точку на мировой xz. И так для каждого угла экрана.

Зачем мне это понадобилось? Вот таким действием я хочу получить зону видимости камеры по плоскости xz, затем заполнить её треугольниками. Потом деформировать полученный меш получая данные из массива 1024х1024 или больше.

dsd 06.07.2011 15:21

Ответ: Имитация водной поверхности.
 
Работать с прямыми и маркерами, оказалось куда легче и прозрачней :)

Код:

Include "xors3d.bb"
Global pivot,camera,mxs#,mys#,Light,ball

Global lefttop,leftdown,righttop,rightdown
Dim ScreenData#(4,3)

xGraphics3D(1024,600, 32,0, 0)

pivot=xCreatePivot()
camera = xCreateCamera(pivot)
light = xCreateLight()


For i=0 To 50
gg=xCreateCube()
xPositionEntity gg,Rnd(0,50),0,Rnd(0,50)
Next

SetMarkers(150,34,19)

bh0=xCreateCube()
xScaleEntity bh0,0.5,0.5,0.5
xEntityColor bh0,255,255,0
bh1=xCopyEntity(bh0)
bh2=xCopyEntity(bh0)
bh3=xCopyEntity(bh0)

While(Not (xKeyHit(KEY_ESCAPE) Or xWinMessage("WM_CLOSE")))
xPositionEntity bh0,ScreenData#(0,0),ScreenData#(0,1),ScreenData#(0,2)
xPositionEntity bh1,ScreenData#(1,0),ScreenData#(1,1),ScreenData#(1,2)
xPositionEntity bh2,ScreenData#(2,0),ScreenData#(2,1),ScreenData#(2,2)
xPositionEntity bh3,ScreenData#(3,0),ScreenData#(3,1),ScreenData#(3,2)

xUpdateWorld
xRenderWorld()
DrawLine()
Control(1.1,1)
        xFlip()
Wend

End



Function DrawLine()
;входные значения
;камера это точка с индексом 1
x000#=xEntityX(camera,1)
y000#=xEntityY(camera,1)
z000#=xEntityZ(camera,1)
;нижний левый
x00#=xEntityX(leftdown,1)
y00#=xEntityY(leftdown,1)
z00#=xEntityZ(leftdown,1)
;верхний левый
x01#=xEntityX(lefttop,1)
y01#=xEntityY(lefttop,1)
z01#=xEntityZ(lefttop,1)
;верхний правый
x11#=xEntityX(righttop,1)
y11#=xEntityY(righttop,1)
z11#=xEntityZ(righttop,1)
;нижний правый
x10#=xEntityX(rightdown,1)
y10#=xEntityY(rightdown,1)
z10#=xEntityZ(rightdown,1)

; теперь построю четыре прямых по уравнению  (x-x1)/(x2-x1)=(y-y1)/(y2-y1)=(z-z1)/(z2-z1)
; точка левого нижнего угла. Так как проецирую на xz то у=0
Mdly#=-y000/(y00-y000)

Mdlx#=mdly*(x00-x000)+x000
Mdlz#=mdly*(z00-z000)+z000

; точка левого верхнего угла. Так как проецирую на xz то у=0
Mtly#=-y000/(y01-y000)

Mtlx#=mtly*(x01-x000)+x000
Mtlz#=mtly*(z01-z000)+z000

; точка правого верхнего угла. Так как проецирую на xz то у=0
MtRy#=-y000/(y11-y000)

MtRx#=mtRy*(x11-x000)+x000
MtRz#=mtRy*(z11-z000)+z000

; точка правого нижнего угла. Так как проецирую на xz то у=0
MDRy#=-y000/(y10-y000)

MDRx#=mDRy*(x10-x000)+x000
MDRz#=mDRy*(z10-z000)+z000


;левый нижний
ScreenData#(0,0)=Mdlx#
ScreenData#(0,1)=0
ScreenData#(0,2)=Mdlz#

;левый верхний
ScreenData#(1,0)=Mtlx#
ScreenData#(1,1)=0
ScreenData#(1,2)=Mtlz#

;праввый верхний
ScreenData#(2,0)=MtRx#
ScreenData#(2,1)=0
ScreenData#(2,2)=MtRz#

;правый нижний
ScreenData#(3,0)=MDRx#
ScreenData#(3,1)=0
ScreenData#(3,2)=MDRz#

;теперь проверка на расстояние, что бы спроецированные точки не были дальше от камеры, чем маркеры
;в данных камеры это выполняется легко

;проверка левого нижнего угла
xTFormPoint ScreenData#(0,0),ScreenData#(0,1),ScreenData#(0,2),0,camera
If xTFormedZ()>xEntityZ(leftdown) Then
ScreenData#(0,0)=xEntityX(leftdown,1)
ScreenData#(0,2)=xEntityZ(leftdown,1)
EndIf
;проверка левого верхнего угла
xTFormPoint ScreenData#(1,0),ScreenData#(1,1),ScreenData#(1,2),0,camera
If xTFormedZ()>xEntityZ(lefttop) Then
ScreenData#(1,0)=xEntityX(lefttop,1)
ScreenData#(1,2)=xEntityZ(lefttop,1)
EndIf

;проверка правого верхнего угла
xTFormPoint ScreenData#(2,0),ScreenData#(2,1),ScreenData#(2,2),0,camera
If xTFormedZ()>xEntityZ(righttop) Then
ScreenData#(2,0)=xEntityX(righttop,1)
ScreenData#(2,2)=xEntityZ(righttop,1)
EndIf

;проверка левого верхнего угла
xTFormPoint ScreenData#(3,0),ScreenData#(3,1),ScreenData#(3,2),0,camera
If xTFormedZ()>xEntityZ(rightdown) Then
ScreenData#(3,0)=xEntityX(rightdown,1)
ScreenData#(3,2)=xEntityZ(rightdown,1)
EndIf

; теперь проверка ставящая точку в правильное место если она оказалась за позади камеры

;проверка левого нижнего угла
xTFormPoint ScreenData#(0,0),ScreenData#(0,1),ScreenData#(0,2),0,camera
If xTFormedZ()<0 Then
ScreenData#(0,0)=xEntityX(leftdown,1)
ScreenData#(0,2)=xEntityZ(leftdown,1)
EndIf
;проверка левого верхнего угла
xTFormPoint ScreenData#(1,0),ScreenData#(1,1),ScreenData#(1,2),0,camera
If xTFormedZ()<0 Then
ScreenData#(1,0)=xEntityX(lefttop,1)
ScreenData#(1,2)=xEntityZ(lefttop,1)
EndIf

;проверка правого верхнего угла
xTFormPoint ScreenData#(2,0),ScreenData#(2,1),ScreenData#(2,2),0,camera
If xTFormedZ()<0 Then
ScreenData#(2,0)=xEntityX(righttop,1)
ScreenData#(2,2)=xEntityZ(righttop,1)
EndIf

;проверка левого верхнего угла
xTFormPoint ScreenData#(3,0),ScreenData#(3,1),ScreenData#(3,2),0,camera
If xTFormedZ()<0 Then
ScreenData#(3,0)=xEntityX(rightdown,1)
ScreenData#(3,2)=xEntityZ(rightdown,1)
EndIf



End Function




Function SetMarkers(distance#,yaw#,pitch#)

;yaw#=34  ;36
;pitch#=19                ;19.5

lefttop=xCreateCube(camera)
xEntityColor lefttop,255,0,0
leftdown=xCopyEntity(lefttop,camera)
righttop=xCopyEntity(lefttop,camera)
rightdown=xCopyEntity(lefttop,camera)


xr#=-Sin(yaw)*distance
yr#=Cos(yaw)*distance
zbh#=Sin(pitch)*distance
zbd#=Sin(-pitch)*distance
xPositionEntity lefttop,xr,zbh,yr
xPositionEntity leftdown,xr,zbd,yr
xPositionEntity righttop,-xr,zbh,yr
xPositionEntity rightdown,-xr,zbd,yr

End Function


Function control(speed#,mousesensitivity#)
If xKeyDown(key_1) Then xWireframe(True) Else xWireframe(False)
        xText(10, 10, "FPS: " + xGetFPS())       
                xText(10,30,"Trisinview: "+xTrisRendered ())
mxs#=mxs#+(xMouseXSpeed()/5.0)
mys#=mys#+(xMouseYSpeed()/5.0)
xRotateEntity (camera,mousesensitivity#*mys#,-mousesensitivity#*mxs#,0)
xMoveMouse xGraphicsWidth()/2,xGraphicsHeight()/2
If xKeyDown(17) Or xKeyDown(200) xMoveEntity camera,0,0,speed#
If xKeyDown(31) Or xKeyDown(208) xMoveEntity camera,0,0,-speed#
If xKeyDown(30) Or xKeyDown(203) xMoveEntity camera,-speed#,0,0
If xKeyDown(32) Or xKeyDown(205) xMoveEntity camera,speed#,0,0
xPositionEntity pivot,xEntityX#(camera,1),xEntityY#(camera,1),xEntityZ#(camera,1)
xPositionEntity camera,0,0,0
End Function


dsd 07.07.2011 01:01

Ответ: Имитация водной поверхности.
 
Вот этот пример террэйна в атаче сильно страшный или пойдет?

NitE 07.07.2011 02:26

Ответ: Имитация водной поверхности.
 
А чо, мне нравится. Тока воду надо как-то подстрайвать под положение камеры и часть террейна иногда пропадает, опять-же при определенном положений камеры.

dsd 08.07.2011 23:07

Ответ: Имитация водной поверхности.
 
Внезапно осознал как ускорить свой генератор высот во много раз. Теперь изображение генерируется раз в 10 дольше массива. Плюс добавил отрисовку уровня моря и еще кое что.

Кстати, а почему шаг в цикле for ... next нельзя менять даже вне цикла?

Код:

Global xelements=1024,maxd,img,h#
Global sealevel#=0.15
Global MountainDiff=4
Graphics3D 536,536,0,2
SetBuffer BackBuffer()

SeedRnd MilliSecs()
z=Rand(20,4500)

While  Not z=0 Or KeyHit(1)
maxd=maxd+1
z=xelements Shr maxd
Wend
maxd=maxd-1
Print "number of repetitions: "+maxd

Dim heightmap#(xelements,xelements,2)
heightmap#(0,0,0)=Rnd(-5,5)                                                                                                heightmap#(0,0,1)=1
heightmap#(xelements-1,0,0)=Rnd(-5,5)                                                        heightmap#(xelements-1,0,1)=1
heightmap#(0,xelements-1,0)=Rnd(-5,5)                                                        heightmap#(0,xelements-1,0)=1
heightmap#(xelements-1,xelements-1,0)=Rnd(-5,5)                heightmap#(xelements-1,xelements-1,0)=1

h00#=heightmap#(0,0,0)
h10#=heightmap#(xelements-1,0,0)
h01#=heightmap#(0,xelements-1,0)
h11#=heightmap#(xelements-1,xelements-1,0)


For d=maxd To 1 Step -1

bz=2^(d-1)
x0=0
While Not  x0>( xelements-1)
y0=0
While Not  y0>( xelements-1)

                        x000=Abs((x0-bz) Mod xelements)
                        y000=Abs((y0-bz) Mod xelements)
                        x001=Abs((x0+bz)Mod xelements)
                        y001=Abs((y0+bz)Mod xelements)                       
                        x002=Abs((x0+bz-1)Mod xelements)
                        y002=Abs((y0+bz-1)Mod xelements)

                        x00#=heightmap#(x000,y000,0)
                        x01#=heightmap#(x001,y000,0)
                        x10#=heightmap#(x000,y001,0)
                        x11#=heightmap#(x001,y001,0)

                        If heightmap#(x001,y001,1)=1 And heightmap#(x000,y001,1)=1 And heightmap#(x001,y000,1)=1 And heightmap#(x000,y000,1)=1 Then

                                heightmap#(x0,y0,0)=(x00+x01+x10+x11)/4+1.44*bz*Rnd(-0.2,0.2)
                                heightmap#(x000,y0,0)=(x00+x10)/2+bz*Rnd(-0.1,0.1)
                                heightmap#(x001,y0,0)=(x01+x11)/2+bz*Rnd(-0.1,0.1)
                                heightmap#(x0,y000,0)=(x00+x01)/2+bz*Rnd(-0.1,0.1)
                                heightmap#(x0,y001,0)=(x11+x10)/2+bz*Rnd(-0.1,0.1)

                                heightmap#(x0,y0,1)=1
                                heightmap#(x000,y0,1)=1
                                heightmap#(x001,y0,1)=1
                                heightmap#(x0,y000,1)=1
                                heightmap#(x0,y001,1)=1
                               
                        EndIf
y0=y0+bz               

Wend
x0=x0+bz
Wend
Print Abs((d-maxd)*100/maxd)+"%      "+(xelements-1)Mod (1 Shl d) + "      " + bz
Next
Print "Array is ready"
Print "resize of array elements just started"
hmax#=0
hmin#=0
For x=1 To xelements
For y=1 To xelements
x0=x-1
y0=y-1
If heightmap#(x0,y0,0)>hmax Then hmax=heightmap#(x0,y0,0)
If heightmap#(x0,y0,0)<hmin Then hmin=heightmap#(x0,y0,0)
Next
Next

h#=hmax-hmin
For x=1 To xelements
For y=1 To xelements
x0=x-1
y0=y-1
heightmap#(x0,y0,0)=((heightmap#(x0,y0,0)-hmin)/h)^MountainDiff
Next
Next


MakeImage()
ResizeImage img,512,512


While Not  ((KeyDown(56) And KeyHit(62)) Or  (KeyHit(56) And KeyDown(62))  Or KeyHit(1))

UpdateWorld
RenderWorld
ClsColor 0,75,151
Cls
DrawImage img,12,12

;Text 200,400,17 Mod (1 Shl 8)
;Text 200,420,hmin+"    "+hmax

Text 0,0,1 Shl 8
Flip
Wend
End

Function MakeImage()
Print "Making image"
img=CreateImage(xelements,xelements)
SetBuffer ImageBuffer(img)
ClsColor 255,0,0
Cls
For x=1 To xelements
For y=1 To xelements
x0=x-1
y0=y-1
d=255*(1-heightmap#(x0,y0,0))

;If x0>xelements/2 Then d=Rand(0,255) ; for viewing regular noise, just to find is there any difference or not
Color d,d,d
If heightmap#(x0,y0,0)<sealevel Then Color 57,67,255 ;for showing sea level

Plot x0,y0

Next
Next
SetBuffer BackBuffer()
End Function


moka 09.07.2011 04:51

Ответ: Имитация водной поверхности.
 
Скринами кормить не забывай - это очень эффективно ;)

Dream 09.07.2011 05:05

Ответ: Имитация водной поверхности.
 
Цитата:

Сообщение от dsd (Сообщение 194767)
Кстати, а почему шаг в цикле for ... next нельзя менять даже вне цикла?

юзай вместо "for" while - и всё будет хорошо

dsd 10.07.2011 23:34

Ответ: Имитация водной поверхности.
 


По моему во время просмотра складывается впечатление, что алгоритм гораздо сложней, чем он есть на самом деле:).

Сложный алгоритм работающий в 20 раз медленней, но честно, при полном отсутствии разницы заметной на глаз походу глупость.

LLI.T.A.L.K.E.R. 10.07.2011 23:38

Ответ: Имитация водной поверхности.
 
"Живая земля" припоминает игру IGI :)
Ностальгия.. Сыграю в неё ещё раз.

Исходник tt002.bb пока сложно даётся. Суть сразу не разберёшь. Это через шейдер? (похоже нет)

dsd 11.07.2011 01:57

Ответ: Имитация водной поверхности.
 
Перевел в хорс свою самобытную систему частиц. Кажется я замучу на этой неделе какое-никакое дерево.

Люди, дайте шейдер, который будет делать объект похожим на ежа. Просто рисующий нормали, что ли. Пожалста :) Только попроще.

HolyDel 11.07.2011 10:08

Ответ: Имитация водной поверхности.
 
Цитата:

Просто рисующий нормали, что ли.
dx10 only. геометрические шейдеры нужны. для генерации новых приммитивов

dsd 13.07.2011 02:53

Ответ: Имитация водной поверхности.
 
Код:

float4x4 matrixWorldViewProj : MATRIX_WORLDVIEWPROJ; // матрица итоговая
float4x4 matrixWorld : MATRIX_WORLD; // матрица мировая

float time;

float3 lightDirection : LIGHT0_DIRECTION; // направление
float4 lightColor : LIGHT0_COLOR; // цвет
float4 entityColor : COLOR_DIFFUSE; // цвет объекта
texture diffuseTexture : TEXTURE_0; // текстура
// описываем sampler
sampler diffuseSampler = sampler_state
{
Texture = <diffuseTexture>; // привязываем текстуру
// устанавливаем адресацию координат
AddressU = WRAP;
AddressV = WRAP;
AddressW = WRAP;
// устанавливаем фильтрацию
MinFilter = ANISOTROPIC;
MagFilter = ANISOTROPIC;
MipFilter = ANISOTROPIC;
// устанавливаем уровень фильтрации
MaxAnisotropy = 4;
};
// входная структура для вершинного шейдера
struct VSInput
{
float4 position : POSITION;
float3 normal : NORMAL;
float2 texCoords : TEXCOORD0;
};
// структура для результата вершинного шейдера
struct VSOutput
{float4 position : POSITION;
float3 normal : TEXCOORD1;
float2 texCoords : TEXCOORD0;
};
// вершинный шейдер
VSOutput VSMain(VSInput input)
{
// объект для выходных данных
VSOutput output;
// трансформируем позицию вершины
float xoops = input.position.x-8*cos(radians(time/10+3*input.position.x));
float yoops = input.position.z-6*sin(radians(time/35+1.5*input.position.z));
float zoops = 8*cos(radians(time/10+3*input.position.x))+6*sin(radians(time/35+1.5*input.position.z));
output.position = mul(float4(input.position.xyz+float3(xoops,zoops,yoops),input.position.w), matrixWorldViewProj);
// трансформируем и нормализуем нормаль
output.normal = normalize(mul(input.normal, matrixWorld));
// переписываем текстурные координаты
output.texCoords = input.texCoords;
// возвращаем результат
return output;
}
// пиксельный шейдер
float4 PSMain(VSOutput input) : COLOR0
{
// делаем выборку из текстуры
float4 diffuse = tex2D(diffuseSampler, input.texCoords);
// расчитываем освещенность точки
float lit = dot(input.normal, -lightDirection*1.5f);
// возвращаем результирующий цвет пиксела
return (diffuse * entityColor * lit * lightColor);
}
// техника для отрисовки
technique Diffuse
{
pass p0
{
VertexShader = compile vs_2_0 VSMain();
PixelShader = compile ps_2_0 PSMain();
}
}

в общем ввел я деформацию в шейдер. Ништяк, теперь плоскость гнется без затрат процессорного времени. Прям как будто я рендрю просто плоскость и ничего с ней не делаю. Но нормали не меняются. А рассчитать нормали я пока умею посчитав плоскость по трем точкам. Но как получить координаты трех точек принадлежащих полигону в шейдере? Или проще научиться искать касательные к уравнениям деформации? Это вроде производная от них?

Вопрос такой: Как вы находите новые нормали изменив геометрию вершинным шейдером? Может есть простой способ?

HolyDel, а шерсть это тоже только от 10 версии?

Mr_F_ 13.07.2011 03:08

Ответ: Имитация водной поверхности.
 
Цитата:

HolyDel, а шерсть это тоже только от 10 версии?
если ты про пример из сдк, там по-тупому.
рендерится много раз кубик, каждый приподнятее другого. на каждого текстура шерсти в разрезе - получается эффект её. нормали так показывать можно конечно, но это достаточно нелепо и затратно + в любом случае главное - несколько пассов, шейдер нужен лишь затем чтобы отодвигать вертексы в направлении нормали.

Цитата:

Вопрос такой: Как вы находите новые нормали изменив геометрию вершинным шейдером? Может есть простой способ?
нету. либо действительно найди формулу нормалей, подходящую под твою формулу деформации, либо читать из текстуры, но читать её в VS, это очень медленно.

dsd 13.07.2011 04:03

Ответ: Имитация водной поверхности.
 
Риторический пост.

Пока пытался вырубиться, пришло следующее. Коль моя поверхность задана параметрически, то мне в принципе все равно существуют ли в реальности те точки по которым я рассчитываю поверхность. Соответственно в некой небольшой окрестности от точки я считаю координаты трех точек. Получаю уравнение плоскости проходящей через них, соответственно имею перпендикулярный вектор к плоскости. Нормализую его, цель вроде достигнута, причем итоговое приближение поверхности должно быть визуально ближе к уравнениям.

dsd 13.07.2011 16:26

Ответ: Имитация водной поверхности.
 
PHP код:

// вершинный шейдер
VSOutput VSMain(VSInput input)
{
// объект для выходных данных
VSOutput output;
// трансформируем позицию вершины
float xoops input.position.x-8*cos(radians(time/10+3*input.position.x));
float yoops input.position.z-6*sin(radians(time/35+1.5*input.position.z));
float zoops 8*cos(radians(time/10+3*input.position.x))+6*sin(radians(time/35+1.5*input.position.z));
output.position mul(float4(input.position.xyz+float3(xoops,zoops,yoops),input.position.w), matrixWorldViewProj);
// трансформируем и нормализуем нормаль

float x0 input.position.x+0.5f-8*cos(radians(time/10+3*(input.position.x+0.5f)));
float y0 input.position.z+0.5f-6*sin(radians(time/35+1.5*(input.position.z+0.5f)));
float z0 8*cos(radians(time/10+3*(input.position.x+0.5f)))+6*sin(radians(time/35+1.5*(input.position.z+0.5f)));

float x1 input.position.x-0.7f-8*cos(radians(time/10+3*(input.position.x-0.7f)));
float y1 input.position.z+0.5f-6*sin(radians(time/35+1.5*(input.position.z+0.5f)));
float z1 8*cos(radians(time/10+3*(input.position.x-0.7f)))+6*sin(radians(time/35+1.5*(input.position.z+0.5f)));

float x2 input.position.x+0.6f-8*cos(radians(time/10+3*(input.position.x+0.6f)));
float y2 input.position.z-0.9f-6*sin(radians(time/35+1.5*(input.position.z-0.9f)));
float z2 8*cos(radians(time/10+3*(input.position.x+0.6f)))+6*sin(radians(time/35+1.5*(input.position.z-0.9f)));


/*
строю матрицу
!x        y        z        !
!x1-x0    y1-y0            z1-z0            !
!x2-x0    y2-y0            z2-z0            !
*/
float a = (y1-y0)*(z2-z0)-(y2-y0)*(z1-z0);
float b =-((x1-x0)*(z2-z0)-(x2-x0)*(z1-z0));
float c = (x1-x0)*(y2-y0)-(x2-x0)*(y1-y0);


output.normal normalize(mul(float3(a,b,c), matrixWorld));
// переписываем текстурные координаты
output.texCoords input.texCoords+float2(sin(radians(time/15))/5,cos(radians(time/15))/5);
// возвращаем результат
return output;


Кажется я сделал первый шаг в шейдеры :)

В шейдерах при размышлениях о тени, отражении и преломлении ключевое слово это кубомапа?

Mr_F_ 13.07.2011 16:40

Ответ: Имитация водной поверхности.
 
Цитата:

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

для воды часто годится отражение в виде одной картинки - т.е. отрендеренное с камеры, с отражённой об плоскость воды трансформацией.

для неплоских объектов кубмапа, да.

ещё есть всякая хитрота вроде скрин-спейс отражений для дефереда. много не подскажу по этой теме, но нагуглить можно.
в новом патче на crysis2 как раз они.

moka 13.07.2011 19:04

Ответ: Имитация водной поверхности.
 
В crysis2 юзается смесь. Используется статичная кубмапа заранее отрендеренная на объектах для полного отражения, затем используется screen-space отражения, которые могут отразить естественно только то что в экране. Для воды думаю полюбому нужно использовать дополнительно вертикально зеркально отражённой камеры снимок, как это обычно и делают.

dsd 13.07.2011 19:38

Ответ: Имитация водной поверхности.
 


Нечто отдаленно напоминающее л-сустем
Алгоритмическая ботаника рвет мне мозг :-D
Код:

SeedRnd MilliSecs()
Global ph
Global gh

gh=xCreateCylinder(8)
xPositionMesh gh,0,1,0
xScaleMesh gh,0.1,1,0.1

ph=xCreateCube()
xPositionMesh ph,0,1,0
CreateChilds(ph)



For d=0 To xCountChildren(ph)-1
        child=xGetChild(ph,d)
        CreateChilds(child)
Next

For d=0 To xCountChildren(ph)-1
        child=xGetChild(ph,d)
                For z=0 To xCountChildren(child)-1
                        childl2=xGetChild(child,z)
                        CreateChilds(childl2)
                Next
Next

For d=0 To xCountChildren(ph)-1
        child=xGetChild(ph,d)
                For z=0 To xCountChildren(child)-1
                        childl2=xGetChild(child,z)
                                For x=0 To xCountChildren(childl2)-1
                                        childl3=xGetChild(childl2,x)
                                                CreateChilds(childl3)
                                Next
                Next
Next


Function CreateChilds(child)
qbranches=Rand(1,3)
For i=0 To qbranches

pc=xCopyEntity(gh,child)
xPositionEntity pc,0,2,0
xRotateEntity pc,40+Rnd(-15,15),i*(360/(qbranches+1))+Rnd(-25,25),0
Next
End Function


dsd 13.07.2011 21:59

Ответ: Имитация водной поверхности.
 


Я в смущении, оно похоже на дерево. Ппц.

dsd 14.07.2011 01:01

Ответ: Имитация водной поверхности.
 
Оно коряво и с дырками. У него странные квадратные листья цвета грязи следящие за камерой словно за солнцем. Оно не анимировано. Код громоздок и ужасен. Хэндлы и контролы не выведены. Но черт побери это дерево :-D

dsd 29.07.2011 00:27

Ответ: Имитация водной поверхности.
 
Как в хорсе можно манипулировать значением xMouseZ()?
Цитата:

BBDECL void BBCALL xMoveMouse ( int x,
int y
)

Moves the mouse to a designated location.

Although the mouse isn't visible on the screen, the mouse location is still being tracked and you can attach a graphic to it. However, there are times when you want to put the pointer to a specific location on the screen.

Parameters:
x The x coordinate on the screen to move the mouse
y The y coordinate on the screen to move the mouse
Где Z?


Алгоритм ствола дерева с ветками.

1.Создаем цилиндрический меш. Он должен начинаться в (0,0,0)
2.Делаем цилиндр коническим, сжимая верхние точки на 50%
3.Создаем для цилиндра в п.2 детей копий цилиндра с масштабом вдвое меньшим, чем у родителя. Ориентируем их в пространстве и масштабируем их длину по вкусу.
4.Для каждого ребенка повторяем п.3.
5.Повторяем п.4 пока результат не станет похож на дерево.
6.На последний уровень ветвей клеим листья.
7.Профит



Создаем функцию:

Цитата:

Function CreateChilds(child,zscale#,level#)// чилд это будущий пэрент. Длина текущего уровня ветвей, масштаб ветви, должен быть кратным 0.5 (1, 0.5, 0.25, 0.125 ....)

;определяем кол-во ветвей от родительского конца ветки
qbranches=Rand(1,2)
; для хаотичности облика задаем начальное вращение ветвей относительно родительской ветки
sdegree=Rand(0,359)

;создаем ветки детьми
For i=0 To qbranches
;копируем конический цилиндр из п.2
pc=xCopyEntity(gh,child)
; позиционируем цилиндр относительно родителя, -0.01 для того чтобы щели были менее заметны
xPositionEntity pc,0,xMeshHeight(child)-0.01,0
; применяем нужный масшьаб к ветви
xScaleEntity pc,level,zscale+Rnd(-0.1,0.1),level
;задаем положение в пространстве
xRotateEntity pc,40+Rnd(-15,15),sdegree+i*(360/(qbranches+1))+Rnd(-25,25),0
Next
End Function
Теперь можно строить само дерево.

Цитата:

Function BuildTree()
;грузим цилиндрический меш
gh=xLoadMesh("mesh/tree.b3d")
;красим его
xEntityTexture gh,treetex
; ставим основу дерева
base=xCopyEntity (gh)
;скэйлим под куб пивот всего дерева
xScaleEntity base,2,1,2
;делаем загруженный цилиндр коническим
MakeItCone(gh)

; пивот дерева.
ph=xCreateСube()
xPositionMesh ph,0,1,0
xEntityAlpha ph,0.1
CreateChilds(ph,1,1)


;первый уровень ветвей.
For d=0 To xCountChildren(ph)-1
child=xGetChild(ph,d)
CreateChilds(child,0.6,0.5)
Next
;пэрентим к пивоту ствол.
xentityparent base,ph

;второй левел веток
For d=0 To xCountChildren(ph)-1
child=xGetChild(ph,d)
For z=0 To xCountChildren(child)-1
childl2=xGetChild(child,z)
CreateChilds(childl2,0.8,0.25)
Next
Next

;третий левел веток
For d=0 To xCountChildren(ph)-1
child=xGetChild(ph,d)
For z=0 To xCountChildren(child)-1
childl2=xGetChild(child,z)
For x=0 To xCountChildren(childl2)-1
childl3=xGetChild(childl2,x)
CreateChilds(childl3,1.2,0.125)
СоздатьЛистья()
Next
Next
Next


End Function


NitE 29.07.2011 04:39

Ответ: Имитация водной поверхности.
 
MouseZ это колесико мыши. Манипулировать им напрямую кроме как колесиком мыши никак нельзя, но тебя выручит переменная.

dsd 29.07.2011 20:58

Ответ: Имитация водной поверхности.
 
Цитата:

Сообщение от NitE (Сообщение 197040)
MouseZ это колесико мыши. Манипулировать им напрямую кроме как колесиком мыши никак нельзя, но тебя выручит переменная.

В смысле, палить знак изменения мышиного зед и соответствующим образом менять переменную?


Еще пак тупых вопросов по хорсу:

1. Как рисовать во фронтбуфер? Я хочу видеть процесс.

2. Почему тупой код работает, а код работающий в блице не работает.
Кстати я правильно цвет в ARGB перевожу или нет?
Код:

Function SimpleRaytracer()
For y=0 To 300;xGraphicsHeight()-1
For x=0 To 300;xGraphicsWidth()-1
xCameraPick camera,x,y
If xPickedEntity()>0 Then
mesh=xPickedEntity()
xColor xEntityRed(mesh),xEntityGreen(mesh),xEntityBlue(mesh)
xLine x,y,x,y
Else
xColor 0,0,0
xLine x,y,x,y
;mesh=xPickedEntity()
;Ecolor#=xEntityRed(mesh)*255^2+xEntityGreen(mesh)*255+xEntityBlue(mesh)
;ARGB$="FF"+Right$(Hex$(ecolor),6)
;xWritePixel x,y,ARGB$
;Else
;xWritePixel x,y,"FF000000"
EndIf
Next
Next
xFlip

While(Not (xKeyHit(KEY_ESCAPE) Or xWinMessage("WM_CLOSE")))
Wend

End Function

Include "xors3d.bb"

Global pivot,camera,mxs#,mys#,light,test


xGraphics3D(640,480, 32,0, 0)

CreateWorld()
Function CreateWorld()
pivot=xCreatePivot()
camera = xCreateCamera(pivot)
xPositionEntity camera,0,0,-10
light=xCreateLight()
xPositionEntity light,200,200,200
ball=xCreateSphere()
xEntityPickMode ball,2,1,0

For i=0 To 20
ball2=xCopyEntity(ball)
xPositionEntity ball2,Rnd(-10,10),Rnd(-10,10),Rnd(-10,10)
xScaleEntity ball2,Rnd(0.4,2),Rnd(0.4,2),Rnd(0.4,2)
xEntityColor ball2,Rand(0,255),Rand(0,255),Rand(0,255)
xEntityPickMode ball2,2,1,0
Next

base=xCreateCube()
xEntityPickMode base,2,1,0
xScaleEntity base,10,0.1,10
xPositionEntity base,0,-10,0


test=xCreateCube()
xScaleEntity test,0.1,0.1,0.1
xEntityColor test,255,0,0

End Function


While(Not (xKeyHit(KEY_ESCAPE) Or xWinMessage("WM_CLOSE")))

If xMouseDown(1) Then xCameraPick camera,xMouseX(),xMouseY()
xPositionEntity test,xPickedX (),xPickedY (),xPickedZ ()
pitch#=xVectorPitch(xPickedNX (),xPickedNY (),xPickedNZ ())
yaw#=xVectorYaw(xPickedNX (),xPickedNY (),xPickedNZ ())
xRotateEntity test,pitch,yaw,0

xRenderWorld()
Control(0.2,1)

If xPickedEntity()>0 Then
mesh=xPickedEntity()
Ecolor#=xEntityRed(mesh)*255^2+xEntityGreen(mesh)* 255+xEntityBlue(mesh)
ARGB$="FF"+Right$(Hex$(ecolor),6)
xText 100,200,ARGB
EndIf

If xKeyDown(57) SimpleRaytracer()

xFlip()
Wend

End
Function SimpleRaytracer()
For y=0 To 300;xGraphicsHeight()-1
For x=0 To 300;xGraphicsWidth()-1
xCameraPick camera,x,y
If xPickedEntity()>0 Then
mesh=xPickedEntity()
xColor xEntityRed(mesh),xEntityGreen(mesh),xEntityBlue(me sh)
xLine x,y,x,y
Else
xColor 0,0,0
xLine x,y,x,y
;mesh=xPickedEntity()
;Ecolor#=xEntityRed(mesh)*255^2+xEntityGreen(mesh) *255+xEntityBlue(mesh)
;ARGB$="FF"+Right$(Hex$(ecolor),6)
;xWritePixel x,y,ARGB$
;Else
;xWritePixel x,y,"FFFF0000"
EndIf
Next
Next
xFlip

While(Not (xKeyHit(KEY_ESCAPE) Or xWinMessage("WM_CLOSE")))
Wend

End Function



Function control(speed#,mousesensitivity#)
If xKeyDown(key_1) Then xWireframe(True) Else xWireframe(False)
xText(10, 10, "FPS: " + xGetFPS())
xText(10,30,"Trisinview: "+xTrisRendered ())
mxs#=mxs#+(xMouseXSpeed()/5.0)
mys#=mys#+(xMouseYSpeed()/5.0)
xRotateEntity (camera,mousesensitivity#*mys#,-mousesensitivity#*mxs#,0)
xMoveMouse xGraphicsWidth()/2,xGraphicsHeight()/2
If xKeyDown(17) Or xKeyDown(200) xMoveEntity camera,0,0,speed#
If xKeyDown(31) Or xKeyDown(208) xMoveEntity camera,0,0,-speed#
If xKeyDown(30) Or xKeyDown(203) xMoveEntity camera,-speed#,0,0
If xKeyDown(32) Or xKeyDown(205) xMoveEntity camera,speed#,0,0
xPositionEntity pivot,xEntityX#(camera,1),xEntityY#(camera,1),xEnt ityZ#(camera,1)
xPositionEntity camera,0,0,0
End Function

NitE 29.07.2011 21:08

Ответ: Имитация водной поверхности.
 
Ну чем больше крутишь колесо мыши, тем больше MouseZ, так-что да, в начале цикла проверяешь, прибавляешь к переменной, затем обнуляешь.

xSetBuffer

PHP код:

Function ARGB(a=255,r=0,g=0,b=0)
Return (((
aShl 24) + ((rShl 16) + ((gShl 8) + (b))
End Function 


dsd 01.08.2011 20:51

Ответ: Имитация водной поверхности.
 


Это рисует вдоль траектории... трубу.

dsd 02.08.2011 00:26

Ответ: Имитация водной поверхности.
 


p.s. Цена тридэмакса как минимум справедлива :-)

dsd 02.08.2011 06:14

Ответ: Имитация водной поверхности.
 
Вот допустим есть у меня вектор 1(х1,у1,z1) и его длина равна единице. Два перпендикулярных к нему вектора это 2(sqr(1-x1*x1),y1,z1) & 3 (x1,sqr(1-y1*y1),z1)? И эти три вектора взаимно перпендикулярны или нет?

Из условия x1*x2+y1*y2+z1*z2=0 можно построить вектор 2(y1,-x1,0) и условие выполнится. Потом привести вектор 2 к длине равной 1 и перемножив вектор 1х2 полчить третий вектор перпендикулярный и 1-му и 2-му вектору. Но это у меня правильно работало только если 1(0,1,0). Где косяк(в том что я даю 2 вектору z=0?)?

dsd 02.08.2011 18:15

Ответ: Имитация водной поверхности.
 
Ну так что? Или все пользуются только тригонометрией? Шейдерные джедаи, ну вы то точно векторами должны баловаться ) причем все должно быть уже на рефлексах у вас. Или вектора для всех такая терра инкогнито што пестец?

Mr_F_ 02.08.2011 18:21

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

dsd 02.08.2011 18:45

Ответ: Имитация водной поверхности.
 
Mr_F_, ну да если есть два перпендикулярных вектора то третий взаимноперпендикулярный получается просто векторным умножением исходных двух. Есть еще фишка в скалярном умножении двух векторов, оно есть косинус угла между ними. Соответсвенно из него и вытекает условие перпендикулярности. Я вот чую задом, что можно легко, практически без вычислений и систем уравнений, Находить три ортогональных вектора.

Команда cross это на блитце(хорсе) или на хсхл?

Mr_F_ 02.08.2011 19:02

Ответ: Имитация водной поверхности.
 
на хлсл

dsd 03.08.2011 21:05

Ответ: Имитация водной поверхности.
 
Запилил кучку простых функций слегка расширяющих зdmath. Теперь я имею следующую проблему:
Код:

Function RollVector(angle#,x1#,y1#,z1#,x2#,y2#,z2#)
; поворачивает вектор 1 в плоскости 1 и 2 векторов.
length#=Sqr#(x1#*x1#+y1#*y1#+z1#*z1#)
If Not (angle# Mod 90)=0 Then

d#=length#*Tan#(angle#)
; normal to 1 and 2
x0#=y1#*z2#-y2#*z1#
y0#=z1#*x2#-z2#*x1#
z0#=x1#*y2#-x2#*y1#


;normal to 1 and 0
x3#=y1#*z0#-y0#*z1#
y3#=z1#*x0#-z0#*x1#
z3#=x1#*y0#-x0#*y1#
lengthof3#=Sqr#(x3#^2+y3#^2+z3#^2)

x3#=x3#/lengthof3#
y3#=y3#/lengthof3#
z3#=z3#/lengthof3#

vectorx#=(x1#+x3#*d#)/Sqr#(1+Tan#(angle#))
vectory#=(y1#+y3#*d#)/Sqr#(1+Tan#(angle#))
vectorz#=(z1#+z3#*d#)/Sqr#(1+Tan#(angle#))
Else
RuntimeError "RollVector(angle#,x1#,y1#,z1#,x2#,y2#,z2#) is too stupid for rolling vector on 90 degree, try something else."
EndIf
End Function

Дает на выход только целые числа. Но я ей не даю целых чисел. И в расчете у нее целые должны получаться редко, очень редко.
причем косяк в отбрасывании дрбной части проявляется если я пытаюсь сделать вектор длинной 1, пофиг руками или xtformnormal. Куда эту хрень нужно ударить бубном, чтобы она стала выдавать числа полностью?

moka 03.08.2011 21:09

Ответ: Имитация водной поверхности.
 
Function RollVector#(...

?

dsd 03.08.2011 21:13

Ответ: Имитация водной поверхности.
 
Неа.

Может косяк только у меня происходит?
Код:

Include "xors3d.bb"

Global pivot,camera,mxs#,mys#,light
Global vectorx#,vectory#,vectorz#

xGraphics3D(640,480, 32,0, 0)

pivot=xCreatePivot()
camera = xCreateCamera(pivot)
light=xCreateLight()
xPositionEntity light,200,200,200

While(Not (xKeyHit(KEY_ESCAPE) Or xWinMessage("WM_CLOSE")))
xRenderWorld()
DrawSample()
Control(1.1,1)
        xFlip()
Wend

End

Function Cross(x1#,y1#,z1#,x2#,y2#,z2#)

vectorx=y1*z2-y2*z1
vectory=z1*x2-z2*x1
vectorz=x1*y2-x2*y1

End Function



Function VecX()
Return vectorx#
End Function

Function VecY()
Return vectory#
End Function


Function VecZ()
Return vectorz#
End Function

Function RollVector(angle#,x1#,y1#,z1#,x2#,y2#,z2#)
; поворачивает вектор 1 в плоскости 1 и 2 векторов.
length#=Sqr#(x1#*x1#+y1#*y1#+z1#*z1#)
If Not (angle# Mod 90)=0 Then

d#=length#*Sin#(angle#)/Cos(angle)
; normal to 1 and 2
x0#=y1#*z2#-y2#*z1#
y0#=z1#*x2#-z2#*x1#
z0#=x1#*y2#-x2#*y1#


;normal to 1 and 0
x3#=y1#*z0#-y0#*z1#
y3#=z1#*x0#-z0#*x1#
z3#=x1#*y0#-x0#*y1#
lengthof3#=Sqr#(x3#^2+y3#^2+z3#^2)

x3#=x3#/lengthof3#
y3#=y3#/lengthof3#
z3#=z3#/lengthof3#

vectorx#=(x1#+x3#*d#)/Sqr#(1+Sin#(angle#)^2/Cos(angle)^2)
vectory#=(y1#+y3#*d#)/Sqr#(1+Tan#(angle#)^2)
vectorz#=(z1#+z3#*d#)/Sqr#(1+Tan#(angle#)^2)
Else
RuntimeError "RollVector(angle#,x1#,y1#,z1#,x2#,y2#,z2#) is too stupid for rolling vector on 90 degree, try something else."
EndIf
End Function

Function DrawSample()

;base point
x0#=Sin(MilliSecs()/40)*7
y0#=6*Sin(MilliSecs()/40)
z0#=Cos(MilliSecs()/40)*8+50


;first vector
x1#=Sin(MilliSecs()/20)*10
y1#=0
z1#=Cos(MilliSecs()/20)*10

x2#=y1-z1
y2#=-x1
z2#=x1

Cross(x1,y1,z1,x2,y2,z2)
xTFormNormal VecX(),VecY(),VecZ(),0,0
        x3#=xTFormedX()*10
        y3#=xTFormedY()*10
        z3#=xTFormedZ()*10


RollVector(32.33,x3,y3,z3,x2,y2,z2)
        x4#=VecX()
        y4#=VecY()
        z4#=VecZ()
xText 100,100,x4
xText 100,110,y4
xText 100,120,z4
;drawing
xCameraProject camera,x0,y0,z0
lx0#=xProjectedX()
ly0#=xProjectedY()

xCameraProject camera,x0+x1,y0+y1,z0+z1
lx1#=xProjectedX()
ly1#=xProjectedY()

xColor 255,0,0
xLine lx0,ly0,lx1,ly1
xText lx1,ly1,"First Vector"

xCameraProject camera,x0+x2,y0+y2,z0+z2
lx2#=xProjectedX()
ly2#=xProjectedY()

xColor 0,255,0
xLine lx0,ly0,lx2,ly2
xText lx2,ly2,"Second Vector"

xCameraProject camera,x0+x3,y0+y3,z0+z3
lx3#=xProjectedX()
ly3#=xProjectedY()

xColor 0,0,255
xLine lx0,ly0,lx3,ly3
xText lx3,ly3,"Third Vector"

xCameraProject camera,x0+x4,y0+y4,z0+z4
lx4#=xProjectedX()
ly4#=xProjectedY()

xColor 255,0,255
xLine lx0,ly0,lx4,ly4
xText lx4,ly4,"Forth Vector it's turned to 3 vector for 32.33 degree in plane of 3 and 2 vectors"
xColor 255,255,255
End Function

Function control(speed#,mousesensitivity#)
If xKeyDown(key_1) Then xWireframe(True) Else xWireframe(False)
        xText(10, 10, "FPS: " + xGetFPS())       
                xText(10,30,"Trisinview: "+xTrisRendered ())
mxs#=mxs#+(xMouseXSpeed()/5.0)
mys#=mys#+(xMouseYSpeed()/5.0)
speed#=speed*xGetFPS()/1000
xRotateEntity (camera,mousesensitivity#*mys#,-mousesensitivity#*mxs#,0)
xMoveMouse xGraphicsWidth()/2,xGraphicsHeight()/2
If xKeyDown(17) Or xKeyDown(200) xMoveEntity camera,0,0,speed#
If xKeyDown(31) Or xKeyDown(208) xMoveEntity camera,0,0,-speed#
If xKeyDown(30) Or xKeyDown(203) xMoveEntity camera,-speed#,0,0
If xKeyDown(32) Or xKeyDown(205) xMoveEntity camera,speed#,0,0
xPositionEntity pivot,xEntityX#(camera,1),xEntityY#(camera,1),xEntityZ#(camera,1)
xPositionEntity camera,0,0,0
End Function


dsd 03.08.2011 22:26

Ответ: Имитация водной поверхности.
 
Косяк оказался в этой части:
vectorx#=(x1#+x3#*d#)/Sqr#(1+Tan#(angle#))
vectory#=(y1#+y3#*d#)/Sqr#(1+Tan#(angle#))
vectorz#=(z1#+z3#*d#)/Sqr#(1+Tan#(angle#))

В другой функции все передавалось правильно, а в этой уже только целые наружу выходили, причем не как целая часть, а округленные. Где-то они неведомым образом превращались в целые, наплевав, что они обьявлены вот так в начале программы:
Global vectorx#,vectory#,vectorz#

Я так понимаю, что в бэйсике сделав так:
global var1#

var=15/3 ; запишет в var float

var=153/14 ; запишет уже только интежер.
В следующем цикле в первый раз все опять таки правильно выполнится. А второй вызов будет считать переменную уже только целочисленной.
У меня нечто такое происходит почему то. Так и должно быть?

tormoz 03.08.2011 23:11

Ответ: Имитация водной поверхности.
 
Цитата:

Сообщение от dsd (Сообщение 197927)
Косяк оказался в этой части:
vectorx#=(x1#+x3#*d#)/Sqr#(1+Tan#(angle#))
vectory#=(y1#+y3#*d#)/Sqr#(1+Tan#(angle#))
vectorz#=(z1#+z3#*d#)/Sqr#(1+Tan#(angle#))

В другой функции все передавалось правильно, а в этой уже только целые наружу выходили, причем не как целая часть, а округленные. Где-то они неведомым образом превращались в целые, наплевав, что они обьявлены вот так в начале программы:
Global vectorx#,vectory#,vectorz#

Я так понимаю, что в бэйсике сделав так:
global var1#

var=15/3 ; запишет в var float

var=153/14 ; запишет уже только интежер.
В следующем цикле в первый раз все опять таки правильно выполнится. А второй вызов будет считать переменную уже только целочисленной.
У меня нечто такое происходит почему то. Так и должно быть?

vectorx#=(x1#+x3#*d#)/Sqr#(1.0+Tan#(angle#))
vectory#=(y1#+y3#*d#)/Sqr#(1.0+Tan#(angle#))
vectorz#=(z1#+z3#*d#)/Sqr#(1.0+Tan#(angle#))
:cool: :-D

dsd 03.08.2011 23:57

Ответ: Имитация водной поверхности.
 
Спасибо, я сам не просек бы в этом году точно :) Правда я уже сделал вывод через массив и там вроде пофиг на такие ньансы.

dsd 04.08.2011 02:32

Ответ: Имитация водной поверхности.
 

Результат экспериментов с векторами.
Сделал:
Cross(x1#,y1#,z1#,x2#,y2#,z2#) векторное произведение.

RollVector(angle#,x1#,y1#,z1#,x2#,y2#,z2#) -поворот вектора 1 в плоскости векторов 1 и 2.

Normalize(x#,y#,z#) эмм... думаю большинство догадывается, что оно делает.

GetAnyOrt(x#,y#,z#) выдает перпендикуляр к вектору.

Bisec(x1#,y1#,z1#,x2#,y2#,z2#) возвращает биссектрису.

VecLength#(x#,y#,z#) возвращает длину.

MirVec(x1#,y1#,z1#,x2#,y2#,z2#) отражает вектор 1 от плоскости с нормалью 2

dsd 05.08.2011 00:20

Ответ: Имитация водной поверхности.
 
codeblocks-10.05mingw-setup.exe

Кака или делишиос?

На столе на кухне размораживалось мясо и лежало полбулки черствого черного хлеба. Левый кошак с улицы проник на кухню и сожрал хлеб.:-D

dsd 05.08.2011 19:16

Ответ: Имитация водной поверхности.
 


Рисование траектории за объектом. Из-за того, что хорс, походу, наивно полагает, что меш всегда лежит в пределах ((-мешширина;мешширина);(-мешвысота;мешвысота);(-мешглубина;мешглубина)) пришлось прикручивать траекторию не мешом, а сюрфейсом, чтобы хорс её рисовал когда действительно надо, а не когда как ему кажется нужно.

moka 05.08.2011 20:16

Ответ: Имитация водной поверхности.
 
Есть функция для переназначения BoundingBox'а. Т.к. именно по нему происходит вычисление Frustum Culling'а.


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

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