 |
3D-программирование Вопросы, касающиеся программирования 3D мира |
13.07.2011, 16:26
|
#166
|
Мастер
Регистрация: 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)
|
|
Сообщение было полезно следующим пользователям:
|
|
13.07.2011, 16:40
|
#167
|
Терабайт исходников
Регистрация: 13.09.2008
Сообщений: 3,947
Написано 2,189 полезных сообщений (для 6,051 пользователей)
|
Ответ: Имитация водной поверхности.
В шейдерах при размышлениях о тени, отражении и преломлении ключевое слово это кубомапа?
|
ну необязательно.
для воды часто годится отражение в виде одной картинки - т.е. отрендеренное с камеры, с отражённой об плоскость воды трансформацией.
для неплоских объектов кубмапа, да.
ещё есть всякая хитрота вроде скрин-спейс отражений для дефереда. много не подскажу по этой теме, но нагуглить можно.
в новом патче на crysis2 как раз они.
|
(Offline)
|
|
Сообщение было полезно следующим пользователям:
|
|
13.07.2011, 19:04
|
#168
|
.
Регистрация: 05.08.2006
Сообщений: 10,429
Написано 3,454 полезных сообщений (для 6,863 пользователей)
|
Ответ: Имитация водной поверхности.
В crysis2 юзается смесь. Используется статичная кубмапа заранее отрендеренная на объектах для полного отражения, затем используется screen-space отражения, которые могут отразить естественно только то что в экране. Для воды думаю полюбому нужно использовать дополнительно вертикально зеркально отражённой камеры снимок, как это обычно и делают.
|
(Offline)
|
|
13.07.2011, 19:38
|
#169
|
Мастер
Регистрация: 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)
|
|
Сообщение было полезно следующим пользователям:
|
|
13.07.2011, 21:59
|
#170
|
Мастер
Регистрация: 13.06.2011
Сообщений: 1,103
Написано 481 полезных сообщений (для 1,836 пользователей)
|
Ответ: Имитация водной поверхности.
Я в смущении, оно похоже на дерево. Ппц.
Последний раз редактировалось dsd, 10.08.2011 в 03:06.
|
(Offline)
|
|
Эти 9 пользователя(ей) сказали Спасибо dsd за это полезное сообщение:
|
|
14.07.2011, 01:01
|
#171
|
Мастер
Регистрация: 13.06.2011
Сообщений: 1,103
Написано 481 полезных сообщений (для 1,836 пользователей)
|
Ответ: Имитация водной поверхности.
Оно коряво и с дырками. У него странные квадратные листья цвета грязи следящие за камерой словно за солнцем. Оно не анимировано. Код громоздок и ужасен. Хэндлы и контролы не выведены. Но черт побери это дерево 
Последний раз редактировалось dsd, 10.08.2011 в 03:06.
|
(Offline)
|
|
Эти 9 пользователя(ей) сказали Спасибо dsd за это полезное сообщение:
|
|
29.07.2011, 00:27
|
#172
|
Мастер
Регистрация: 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)
|
|
Сообщение было полезно следующим пользователям:
|
|
29.07.2011, 04:39
|
#173
|
злобный флудер
Регистрация: 10.07.2007
Сообщений: 2,585
Написано 789 полезных сообщений (для 1,476 пользователей)
|
Ответ: Имитация водной поверхности.
MouseZ это колесико мыши. Манипулировать им напрямую кроме как колесиком мыши никак нельзя, но тебя выручит переменная.
|
(Offline)
|
|
Сообщение было полезно следующим пользователям:
|
|
29.07.2011, 20:58
|
#174
|
Мастер
Регистрация: 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
|
злобный флудер
Регистрация: 10.07.2007
Сообщений: 2,585
Написано 789 полезных сообщений (для 1,476 пользователей)
|
Ответ: Имитация водной поверхности.
Ну чем больше крутишь колесо мыши, тем больше MouseZ, так-что да, в начале цикла проверяешь, прибавляешь к переменной, затем обнуляешь.
xSetBuffer
Function ARGB(a=255,r=0,g=0,b=0)
Return (((a) Shl 24) + ((r) Shl 16) + ((g) Shl 8) + (b))
End Function
|
(Offline)
|
|
Сообщение было полезно следующим пользователям:
|
|
01.08.2011, 20:51
|
#176
|
Мастер
Регистрация: 13.06.2011
Сообщений: 1,103
Написано 481 полезных сообщений (для 1,836 пользователей)
|
Ответ: Имитация водной поверхности.
Это рисует вдоль траектории... трубу.
Последний раз редактировалось dsd, 10.08.2011 в 03:06.
|
(Offline)
|
|
Эти 4 пользователя(ей) сказали Спасибо dsd за это полезное сообщение:
|
|
02.08.2011, 00:26
|
#177
|
Мастер
Регистрация: 13.06.2011
Сообщений: 1,103
Написано 481 полезных сообщений (для 1,836 пользователей)
|
Ответ: Имитация водной поверхности.
p.s. Цена тридэмакса как минимум справедлива 
Последний раз редактировалось dsd, 02.08.2011 в 02:05.
|
(Offline)
|
|
Эти 4 пользователя(ей) сказали Спасибо dsd за это полезное сообщение:
|
|
02.08.2011, 06:14
|
#178
|
Мастер
Регистрация: 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
|
Мастер
Регистрация: 13.06.2011
Сообщений: 1,103
Написано 481 полезных сообщений (для 1,836 пользователей)
|
Ответ: Имитация водной поверхности.
Ну так что? Или все пользуются только тригонометрией? Шейдерные джедаи, ну вы то точно векторами должны баловаться ) причем все должно быть уже на рефлексах у вас. Или вектора для всех такая терра инкогнито што пестец?
|
(Offline)
|
|
02.08.2011, 18:21
|
#180
|
Терабайт исходников
Регистрация: 13.09.2008
Сообщений: 3,947
Написано 2,189 полезных сообщений (для 6,051 пользователей)
|
Ответ: Имитация водной поверхности.
какой-то запутанный вопрос.
могу лишь сказать что если есть уже хотя бы два перпендикулярных вектора, то третий можно найти через cross.
|
(Offline)
|
|
Ваши права в разделе
|
Вы не можете создавать темы
Вы не можете отвечать на сообщения
Вы не можете прикреплять файлы
Вы не можете редактировать сообщения
HTML код Выкл.
|
|
|
Часовой пояс GMT +4, время: 14:44.
|