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)

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'а.

dsd 05.08.2011 21:50

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

BBDECL void BBCALL xSetSurfaceFrustumSphere ( Surface * surface,
float x,
float y,
float z,
float radii
)

Sets surface's bounding sphere for frustum culling.

Parameters:
surface Surface handle
x x coordinate of bounding sphere center
y y coordinate of bounding sphere center
z z coordinate of bounding sphere center
radii Radius of bounding sphere

Цитата:

BBDECL void BBCALL xCalculateFrustumVolume ( Entity * entity )

Calculates a volume used for frustum culling.

Both frustum box and frustum sphere are calculated. This function is useful if have modified position of the vertices manually.

Parameters:
entity Entity handle

Я так понимаю, что первая ф-ция гораздо выгодней по скорости.

Шо це?
BBDECL void BBCALL xVertexTangent ( Surface * surface,
int vertex,
float x,
float y,
float z
)

Sets the tangent of an existing vertex.

Parameters:
surface Surface handle
vertex Vertex index
x Tangent x of vertex
y Tangent y of vertex
z Tangent z of vertex

BBDECL void BBCALL xVertexBinormal ( Surface * surface,
int vertex,
float x,
float y,
float z
)

Sets the binormal of an existing vertex.

Parameters:
surface Surface handle
vertex Vertex index
x Binormal x of vertex
y Binormal y of vertex
z Binormal z of vertex

.Squid 05.08.2011 21:53

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

xCreateSurface (Entity *entity, Brush *brush=NULL, bool dynamic=false)
Попробуй.

dsd 05.08.2011 22:03

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

Просто в шейдерах я совсем дебил. И пока не догоню векторы не особо хочу в них лезть.


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

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