 |
3D-программирование Вопросы, касающиеся программирования 3D мира |
02.08.2011, 18:45
|
#181
|
Мастер
Регистрация: 13.06.2011
Сообщений: 1,103
Написано 481 полезных сообщений (для 1,836 пользователей)
|
Ответ: Имитация водной поверхности.
Mr_F_, ну да если есть два перпендикулярных вектора то третий взаимноперпендикулярный получается просто векторным умножением исходных двух. Есть еще фишка в скалярном умножении двух векторов, оно есть косинус угла между ними. Соответсвенно из него и вытекает условие перпендикулярности. Я вот чую задом, что можно легко, практически без вычислений и систем уравнений, Находить три ортогональных вектора.
Команда cross это на блитце(хорсе) или на хсхл?
|
(Offline)
|
|
02.08.2011, 19:02
|
#182
|
Терабайт исходников
Регистрация: 13.09.2008
Сообщений: 3,947
Написано 2,189 полезных сообщений (для 6,051 пользователей)
|
Ответ: Имитация водной поверхности.
на хлсл
|
(Offline)
|
|
03.08.2011, 21:05
|
#183
|
Мастер
Регистрация: 13.06.2011
Сообщений: 1,103
Написано 481 полезных сообщений (для 1,836 пользователей)
|
Ответ: Имитация водной поверхности.
Запилил кучку простых функций слегка расширяющих з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. Куда эту хрень нужно ударить бубном, чтобы она стала выдавать числа полностью?
|
(Offline)
|
|
03.08.2011, 21:09
|
#184
|
.
Регистрация: 05.08.2006
Сообщений: 10,429
Написано 3,454 полезных сообщений (для 6,863 пользователей)
|
Ответ: Имитация водной поверхности.
Function RollVector#(...
?
|
(Offline)
|
|
03.08.2011, 21:13
|
#185
|
Мастер
Регистрация: 13.06.2011
Сообщений: 1,103
Написано 481 полезных сообщений (для 1,836 пользователей)
|
Ответ: Имитация водной поверхности.
Неа.
Может косяк только у меня происходит?

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
|
(Offline)
|
|
03.08.2011, 22:26
|
#186
|
Мастер
Регистрация: 13.06.2011
Сообщений: 1,103
Написано 481 полезных сообщений (для 1,836 пользователей)
|
Ответ: Имитация водной поверхности.
Косяк оказался в этой части:
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 ; запишет уже только интежер.
В следующем цикле в первый раз все опять таки правильно выполнится. А второй вызов будет считать переменную уже только целочисленной.
У меня нечто такое происходит почему то. Так и должно быть?
|
(Offline)
|
|
03.08.2011, 23:11
|
#187
|
Гигант индустрии
Регистрация: 14.12.2005
Сообщений: 2,785
Написано 1,183 полезных сообщений (для 4,437 пользователей)
|
Ответ: Имитация водной поверхности.
Сообщение от dsd
Косяк оказался в этой части:
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#))

__________________
|
(Offline)
|
|
Сообщение было полезно следующим пользователям:
|
|
03.08.2011, 23:57
|
#188
|
Мастер
Регистрация: 13.06.2011
Сообщений: 1,103
Написано 481 полезных сообщений (для 1,836 пользователей)
|
Ответ: Имитация водной поверхности.
Спасибо, я сам не просек бы в этом году точно  Правда я уже сделал вывод через массив и там вроде пофиг на такие ньансы.
|
(Offline)
|
|
04.08.2011, 02:32
|
#189
|
Мастер
Регистрация: 13.06.2011
Сообщений: 1,103
Написано 481 полезных сообщений (для 1,836 пользователей)
|
Ответ: Имитация водной поверхности.

Результат экспериментов с векторами.
Сделал:
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, 10.08.2011 в 03:06.
|
(Offline)
|
|
Эти 3 пользователя(ей) сказали Спасибо dsd за это полезное сообщение:
|
|
05.08.2011, 00:20
|
#190
|
Мастер
Регистрация: 13.06.2011
Сообщений: 1,103
Написано 481 полезных сообщений (для 1,836 пользователей)
|
Ответ: Имитация водной поверхности.
codeblocks-10.05mingw-setup.exe
Кака или делишиос?
На столе на кухне размораживалось мясо и лежало полбулки черствого черного хлеба. Левый кошак с улицы проник на кухню и сожрал хлеб.
Последний раз редактировалось dsd, 05.08.2011 в 03:56.
|
(Offline)
|
|
Сообщение было полезно следующим пользователям:
|
|
05.08.2011, 19:16
|
#191
|
Мастер
Регистрация: 13.06.2011
Сообщений: 1,103
Написано 481 полезных сообщений (для 1,836 пользователей)
|
Ответ: Имитация водной поверхности.
Рисование траектории за объектом. Из-за того, что хорс, походу, наивно полагает, что меш всегда лежит в пределах ((-мешширина;мешширина);(-мешвысота;мешвысота);(-мешглубина;мешглубина)) пришлось прикручивать траекторию не мешом, а сюрфейсом, чтобы хорс её рисовал когда действительно надо, а не когда как ему кажется нужно.
Последний раз редактировалось dsd, 10.08.2011 в 03:06.
|
(Offline)
|
|
05.08.2011, 20:16
|
#192
|
.
Регистрация: 05.08.2006
Сообщений: 10,429
Написано 3,454 полезных сообщений (для 6,863 пользователей)
|
Ответ: Имитация водной поверхности.
Есть функция для переназначения BoundingBox'а. Т.к. именно по нему происходит вычисление Frustum Culling'а.
|
(Offline)
|
|
Сообщение было полезно следующим пользователям:
|
|
05.08.2011, 21:50
|
#193
|
Мастер
Регистрация: 13.06.2011
Сообщений: 1,103
Написано 481 полезных сообщений (для 1,836 пользователей)
|
Ответ: Имитация водной поверхности.
Это?
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
|
(Offline)
|
|
05.08.2011, 21:53
|
#194
|
Дэвелопер
Регистрация: 06.04.2009
Адрес: Запорожье
Сообщений: 1,500
Написано 1,011 полезных сообщений (для 4,642 пользователей)
|
Ответ: Имитация водной поверхности.
Во-первых, для таких целей есть шейдеры.
Во-вторых, зачем каждый раз удалять поверхность и создавать ее заново?
В-третьих, есть волшебный флаг
xCreateSurface (Entity *entity, Brush *brush=NULL, bool dynamic=false)
Попробуй.
__________________
|
(Offline)
|
|
Сообщение было полезно следующим пользователям:
|
|
05.08.2011, 22:03
|
#195
|
Мастер
Регистрация: 13.06.2011
Сообщений: 1,103
Написано 481 полезных сообщений (для 1,836 пользователей)
|
Ответ: Имитация водной поверхности.
Лениво было выводить формулы соответствия ячеек массива и индексов вершин.
Просто в шейдерах я совсем дебил. И пока не догоню векторы не особо хочу в них лезть.
|
(Offline)
|
|
Ваши права в разделе
|
Вы не можете создавать темы
Вы не можете отвечать на сообщения
Вы не можете прикреплять файлы
Вы не можете редактировать сообщения
HTML код Выкл.
|
|
|
Часовой пояс GMT +4, время: 03:44.
|