Извините, ничего не найдено.

Не расстраивайся! Лучше выпей чайку!
Регистрация
Справка
Календарь

Вернуться   forum.boolean.name > Программирование игр для компьютеров > Blitz3D > 3D-программирование

3D-программирование Вопросы, касающиеся программирования 3D мира

Ответ
 
Опции темы
Старый 02.08.2011, 18:45   #181
dsd
Мастер
 
Аватар для dsd
 
Регистрация: 13.06.2011
Сообщений: 1,103
Написано 481 полезных сообщений
(для 1,836 пользователей)
Ответ: Имитация водной поверхности.

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

Команда cross это на блитце(хорсе) или на хсхл?
(Offline)
 
Ответить с цитированием
Старый 02.08.2011, 19:02   #182
Mr_F_
Терабайт исходников
 
Аватар для Mr_F_
 
Регистрация: 13.09.2008
Сообщений: 3,947
Написано 2,189 полезных сообщений
(для 6,051 пользователей)
Ответ: Имитация водной поверхности.

на хлсл
(Offline)
 
Ответить с цитированием
Старый 03.08.2011, 21:05   #183
dsd
Мастер
 
Аватар для dsd
 
Регистрация: 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
moka
.
 
Регистрация: 05.08.2006
Сообщений: 10,429
Написано 3,454 полезных сообщений
(для 6,863 пользователей)
Ответ: Имитация водной поверхности.

Function RollVector#(...

?
(Offline)
 
Ответить с цитированием
Старый 03.08.2011, 21:13   #185
dsd
Мастер
 
Аватар для dsd
 
Регистрация: 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
dsd
Мастер
 
Аватар для dsd
 
Регистрация: 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
tormoz
Гигант индустрии
 
Аватар для tormoz
 
Регистрация: 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)
 
Ответить с цитированием
Сообщение было полезно следующим пользователям:
dsd (03.08.2011)
Старый 03.08.2011, 23:57   #188
dsd
Мастер
 
Аватар для dsd
 
Регистрация: 13.06.2011
Сообщений: 1,103
Написано 481 полезных сообщений
(для 1,836 пользователей)
Ответ: Имитация водной поверхности.

Спасибо, я сам не просек бы в этом году точно Правда я уже сделал вывод через массив и там вроде пофиг на такие ньансы.
(Offline)
 
Ответить с цитированием
Старый 04.08.2011, 02:32   #189
dsd
Мастер
 
Аватар для dsd
 
Регистрация: 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 за это полезное сообщение:
moka (04.08.2011), Mr_F_ (04.08.2011), tormoz (04.08.2011)
Старый 05.08.2011, 00:20   #190
dsd
Мастер
 
Аватар для dsd
 
Регистрация: 13.06.2011
Сообщений: 1,103
Написано 481 полезных сообщений
(для 1,836 пользователей)
Ответ: Имитация водной поверхности.

codeblocks-10.05mingw-setup.exe

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

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

Последний раз редактировалось dsd, 05.08.2011 в 03:56.
(Offline)
 
Ответить с цитированием
Сообщение было полезно следующим пользователям:
Mr_F_ (05.08.2011)
Старый 05.08.2011, 19:16   #191
dsd
Мастер
 
Аватар для dsd
 
Регистрация: 13.06.2011
Сообщений: 1,103
Написано 481 полезных сообщений
(для 1,836 пользователей)
Ответ: Имитация водной поверхности.



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

Последний раз редактировалось dsd, 10.08.2011 в 03:06.
(Offline)
 
Ответить с цитированием
Старый 05.08.2011, 20:16   #192
moka
.
 
Регистрация: 05.08.2006
Сообщений: 10,429
Написано 3,454 полезных сообщений
(для 6,863 пользователей)
Ответ: Имитация водной поверхности.

Есть функция для переназначения BoundingBox'а. Т.к. именно по нему происходит вычисление Frustum Culling'а.
(Offline)
 
Ответить с цитированием
Сообщение было полезно следующим пользователям:
dsd (05.08.2011)
Старый 05.08.2011, 21:50   #193
dsd
Мастер
 
Аватар для dsd
 
Регистрация: 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
.Squid
Дэвелопер
 
Аватар для .Squid
 
Регистрация: 06.04.2009
Адрес: Запорожье
Сообщений: 1,500
Написано 1,011 полезных сообщений
(для 4,642 пользователей)
Ответ: Имитация водной поверхности.

Во-первых, для таких целей есть шейдеры.
Во-вторых, зачем каждый раз удалять поверхность и создавать ее заново?
В-третьих, есть волшебный флаг
xCreateSurface (Entity *entity, Brush *brush=NULL, bool dynamic=false)
Попробуй.
__________________

(Offline)
 
Ответить с цитированием
Сообщение было полезно следующим пользователям:
dsd (05.08.2011)
Старый 05.08.2011, 22:03   #195
dsd
Мастер
 
Аватар для dsd
 
Регистрация: 13.06.2011
Сообщений: 1,103
Написано 481 полезных сообщений
(для 1,836 пользователей)
Ответ: Имитация водной поверхности.

Лениво было выводить формулы соответствия ячеек массива и индексов вершин.

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


Опции темы

Ваши права в разделе
Вы не можете создавать темы
Вы не можете отвечать на сообщения
Вы не можете прикреплять файлы
Вы не можете редактировать сообщения

BB коды Вкл.
Смайлы Вкл.
[IMG] код Вкл.
HTML код Выкл.


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


vBulletin® Version 3.6.5.
Copyright ©2000 - 2025, Jelsoft Enterprises Ltd.
Перевод: zCarot
Style crйe par Allan - vBulletin-Ressources.com