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

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

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

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

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

// вершинный шейдер
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;

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

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

Последний раз редактировалось dsd, 10.08.2011 в 03:06.
(Offline)
 
Ответить с цитированием
Сообщение было полезно следующим пользователям:
Mr_F_ (13.07.2011)
Старый 13.07.2011, 16:40   #167
Mr_F_
Терабайт исходников
 
Аватар для Mr_F_
 
Регистрация: 13.09.2008
Сообщений: 3,947
Написано 2,189 полезных сообщений
(для 6,051 пользователей)
Ответ: Имитация водной поверхности.

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

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

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

ещё есть всякая хитрота вроде скрин-спейс отражений для дефереда. много не подскажу по этой теме, но нагуглить можно.
в новом патче на crysis2 как раз они.
(Offline)
 
Ответить с цитированием
Сообщение было полезно следующим пользователям:
dsd (13.07.2011)
Старый 13.07.2011, 19:04   #168
moka
.
 
Регистрация: 05.08.2006
Сообщений: 10,429
Написано 3,454 полезных сообщений
(для 6,863 пользователей)
Ответ: Имитация водной поверхности.

В crysis2 юзается смесь. Используется статичная кубмапа заранее отрендеренная на объектах для полного отражения, затем используется screen-space отражения, которые могут отразить естественно только то что в экране. Для воды думаю полюбому нужно использовать дополнительно вертикально зеркально отражённой камеры снимок, как это обычно и делают.
(Offline)
 
Ответить с цитированием
Старый 13.07.2011, 19:38   #169
dsd
Мастер
 
Аватар для dsd
 
Регистрация: 13.06.2011
Сообщений: 1,103
Написано 481 полезных сообщений
(для 1,836 пользователей)
Ответ: Имитация водной поверхности.



Нечто отдаленно напоминающее л-сустем
Алгоритмическая ботаника рвет мне мозг
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
(Offline)
 
Ответить с цитированием
Сообщение было полезно следующим пользователям:
Mr_F_ (13.07.2011)
Старый 13.07.2011, 21:59   #170
dsd
Мастер
 
Аватар для dsd
 
Регистрация: 13.06.2011
Сообщений: 1,103
Написано 481 полезных сообщений
(для 1,836 пользователей)
Ответ: Имитация водной поверхности.



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

Последний раз редактировалось dsd, 10.08.2011 в 03:06.
(Offline)
 
Ответить с цитированием
Эти 9 пользователя(ей) сказали Спасибо dsd за это полезное сообщение:
Android (14.07.2011), Hurrit (02.08.2011), LLI.T.A.L.K.E.R. (13.07.2011), Mr_F_ (13.07.2011), Nerd (13.07.2011), Nex (14.07.2011), NitE (14.07.2011), Nuprahtor (13.07.2011), Randomize (14.07.2011)
Старый 14.07.2011, 01:01   #171
dsd
Мастер
 
Аватар для dsd
 
Регистрация: 13.06.2011
Сообщений: 1,103
Написано 481 полезных сообщений
(для 1,836 пользователей)
Ответ: Имитация водной поверхности.

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

Последний раз редактировалось dsd, 10.08.2011 в 03:06.
(Offline)
 
Ответить с цитированием
Эти 9 пользователя(ей) сказали Спасибо dsd за это полезное сообщение:
Android (14.07.2011), CAHEK (29.07.2011), Hurrit (02.08.2011), L.D.M.T. (14.07.2011), LLI.T.A.L.K.E.R. (14.07.2011), moka (14.07.2011), Mr_F_ (14.07.2011), Nex (14.07.2011), Reks888 (14.07.2011)
Старый 29.07.2011, 00:27   #172
dsd
Мастер
 
Аватар для dsd
 
Регистрация: 13.06.2011
Сообщений: 1,103
Написано 481 полезных сообщений
(для 1,836 пользователей)
Ответ: Имитация водной поверхности.

Как в хорсе можно манипулировать значением 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
(Offline)
 
Ответить с цитированием
Сообщение было полезно следующим пользователям:
moka (29.07.2011)
Старый 29.07.2011, 04:39   #173
NitE
злобный флудер
 
Регистрация: 10.07.2007
Сообщений: 2,585
Написано 789 полезных сообщений
(для 1,476 пользователей)
Ответ: Имитация водной поверхности.

MouseZ это колесико мыши. Манипулировать им напрямую кроме как колесиком мыши никак нельзя, но тебя выручит переменная.
(Offline)
 
Ответить с цитированием
Сообщение было полезно следующим пользователям:
dsd (29.07.2011)
Старый 29.07.2011, 20:58   #174
dsd
Мастер
 
Аватар для dsd
 
Регистрация: 13.06.2011
Сообщений: 1,103
Написано 481 полезных сообщений
(для 1,836 пользователей)
Ответ: Имитация водной поверхности.

Сообщение от NitE Посмотреть сообщение
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(20 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
(Offline)
 
Ответить с цитированием
Старый 29.07.2011, 21:08   #175
NitE
злобный флудер
 
Регистрация: 10.07.2007
Сообщений: 2,585
Написано 789 полезных сообщений
(для 1,476 пользователей)
Ответ: Имитация водной поверхности.

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

xSetBuffer

Function ARGB(a=255,r=0,g=0,b=0)
Return (((
aShl 24) + ((rShl 16) + ((gShl 8) + (b))
End Function 
(Offline)
 
Ответить с цитированием
Сообщение было полезно следующим пользователям:
dsd (01.08.2011)
Старый 01.08.2011, 20:51   #176
dsd
Мастер
 
Аватар для dsd
 
Регистрация: 13.06.2011
Сообщений: 1,103
Написано 481 полезных сообщений
(для 1,836 пользователей)
Ответ: Имитация водной поверхности.



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

Последний раз редактировалось dsd, 10.08.2011 в 03:06.
(Offline)
 
Ответить с цитированием
Эти 4 пользователя(ей) сказали Спасибо dsd за это полезное сообщение:
Артем Валерьевич (01.08.2011), Android (02.08.2011), Mr_F_ (01.08.2011), St_AnGer (02.08.2011)
Старый 02.08.2011, 00:26   #177
dsd
Мастер
 
Аватар для dsd
 
Регистрация: 13.06.2011
Сообщений: 1,103
Написано 481 полезных сообщений
(для 1,836 пользователей)
Ответ: Имитация водной поверхности.



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

Последний раз редактировалось dsd, 02.08.2011 в 02:05.
(Offline)
 
Ответить с цитированием
Эти 4 пользователя(ей) сказали Спасибо dsd за это полезное сообщение:
Android (02.08.2011), ARA (02.08.2011), Mr_F_ (02.08.2011), St_AnGer (02.08.2011)
Старый 02.08.2011, 06:14   #178
dsd
Мастер
 
Аватар для dsd
 
Регистрация: 13.06.2011
Сообщений: 1,103
Написано 481 полезных сообщений
(для 1,836 пользователей)
Ответ: Имитация водной поверхности.

Вот допустим есть у меня вектор 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?)?
(Offline)
 
Ответить с цитированием
Старый 02.08.2011, 18:15   #179
dsd
Мастер
 
Аватар для dsd
 
Регистрация: 13.06.2011
Сообщений: 1,103
Написано 481 полезных сообщений
(для 1,836 пользователей)
Ответ: Имитация водной поверхности.

Ну так что? Или все пользуются только тригонометрией? Шейдерные джедаи, ну вы то точно векторами должны баловаться ) причем все должно быть уже на рефлексах у вас. Или вектора для всех такая терра инкогнито што пестец?
(Offline)
 
Ответить с цитированием
Старый 02.08.2011, 18:21   #180
Mr_F_
Терабайт исходников
 
Аватар для Mr_F_
 
Регистрация: 13.09.2008
Сообщений: 3,947
Написано 2,189 полезных сообщений
(для 6,051 пользователей)
Ответ: Имитация водной поверхности.

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


Опции темы

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

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


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


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