XGM Forum
Сайт - Статьи - Проекты - Ресурсы - Блоги

Форуме в режиме ТОЛЬКО ЧТЕНИЕ. Вы можете задать вопросы в Q/A на сайте, либо создать свой проект или ресурс.
Вернуться   XGM Forum > Warcraft> Академия: форум для вопросов> Jass
Ник
Пароль
Войти через VK в один клик
Сайт использует только имя.

Ответ
 
alexprey
познающий Unity
offline
Опыт: 68,501
Активность:
Проекция
Вот у меня такой вопрос: кто может написать и объяснить функцию по проекции с игровых координат на проекцию экранных координат, используя игровую камеру! Сижу уже две недели немогу понять как это сделать! Жду вашей помощи!
Старый 16.02.2009, 20:58
Van Damm
wait... what?
offline
Опыт: 22,268
Активность:
Как бы оно уже есть http://xgm.guru/forum/showthread.php?t=19095
Старый 16.02.2009, 21:21
alexprey
познающий Unity
offline
Опыт: 68,501
Активность:
Van Damm, нет мне такая система не годица! У него координаты экраны определяются как -1 и 1, а мне надо 1024 и 768! И еще, а нифига не могу понять как он определяет перспективу камеры!
Ну в общем у меня почти получилось! Вот только не могу разобраться с наклоном камеры! изображение не перемещеается как надо! Кто хочет помочь, смотрите код! Как я не крутил коэфицеэнт в функции Win2World все равно плохо работает!
» Код
Код:
globals
 location LOC = Location(0,0)
 gamecache gc = InitGameCache("Cache.w3v")
 BUTTON BTN
endglobals
function H2I takes handle h returns integer
 return h
 return 0
endfunction
function SetIParam takes handle h, string key, integer i returns nothing
 call StoreInteger(gc, I2S(H2I(h)), key, i)
endfunction
function GetIParam takes handle h, string key returns integer
 return GetStoredInteger(gc, I2S(H2I(h)), key)
endfunction
function SetUnitZ takes unit u, real z returns nothing
 call SetUnitFlyHeight(u, z, 0)
endfunction
function GetUnitZ takes unit u returns real
 return GetUnitFlyHeight(u)
endfunction
function CreateUn takes player p, integer id, real x, real y, real f returns unit
 local unit u = CreateUnit(p, id, x,y,f)
 call ShowUnit(u, false)
 if GetLocalPlayer() == p then 
  call ShowUnit(u, true)
 endif
 return u
endfunction
//POINT
struct POINT
 real x
 real y
 real z
 static method New takes real x, real y, real z returns POINT
  local POINT this = POINT.create()
  set .x = x
  set .y = y
  set .z = z
  return this
 endmethod
 static method Move takes POINT p, real nx, real ny, real nz returns nothing
  local POINT this = p
  set .x = nx
  set .y = ny
  set .z = nz
 endmethod
endstruct
function Point takes real x, real y, real z returns POINT
 return POINT.New(x, y, z)
endfunction
function RemovePoint takes POINT p returns nothing
 call p.destroy()
endfunction
function MovePoint takes POINT p, real nx, real ny, real nz returns nothing
 call POINT.Move(p, nx, ny, nz)
endfunction
function IsUpdate takes POINT old, POINT new returns boolean
 if old.x != new.x then
  return true
 endif
 if old.y != new.y then
  return true
 endif
 if old.z != new.z then
  return true
 endif
 return false
endfunction
//CAMERA
struct CAMERA
 POINT target
 POINT center
 real z
 real rotate
 real angle
 real distance
 trigger t
 static method New takes nothing returns CAMERA
  local CAMERA this = CAMERA.create()
  local real x
  local real y
  local real z
  set .rotate = GetCameraField(CAMERA_FIELD_ROTATION)*bj_RADTODEG + 180
  set .angle = GetCameraField(CAMERA_FIELD_ANGLE_OF_ATTACK)*bj_RADTODEG - 180
  set .distance = GetCameraField(CAMERA_FIELD_TARGET_DISTANCE)
  set .z = GetCameraField(CAMERA_FIELD_ZOFFSET)
  set .target = Point(GetCameraTargetPositionX(), GetCameraTargetPositionY(), GetCameraTargetPositionZ() + .z)
  set x = .target.x + .distance*Cos(.rotate*bj_DEGTORAD)/4
  set y = .target.y + .distance*Sin(.rotate*bj_DEGTORAD)/4
  set z = .target.z + .distance*Sin(.angle*bj_DEGTORAD)/4
  set .center = Point(x, y, z)
  return this
 endmethod
 static method Update takes CAMERA cam returns nothing
  local CAMERA this = cam
  local real x
  local real y
  local real z
  set .rotate = GetCameraField(CAMERA_FIELD_ROTATION)*bj_RADTODEG + 180
  set .angle = GetCameraField(CAMERA_FIELD_ANGLE_OF_ATTACK)*bj_RADTODEG - 180
  set .distance = GetCameraField(CAMERA_FIELD_TARGET_DISTANCE)
  set .z = GetCameraField(CAMERA_FIELD_ZOFFSET)
  call MovePoint(.target, GetCameraTargetPositionX(), GetCameraTargetPositionY(), GetCameraTargetPositionZ() + .z)
  set x = .target.x + .distance*Cos(cam.rotate*bj_DEGTORAD)/4
  set y = .target.y + .distance*Sin(cam.rotate*bj_DEGTORAD)/4
  set z = .target.z + .distance*Sin(.angle*bj_DEGTORAD)/4
  call DisplayTextToPlayer(Player(0), 1, 1, R2S(z))
  call MoveLocation(LOC, x, y)
  call MovePoint(.center, x, y, z - GetLocationZ(LOC))
 endmethod 
endstruct
function Win2World takes CAMERA cam, real x, real y returns POINT
 local real nx = cam.center.x + x*Cos((cam.rotate+90)*bj_DEGTORAD)/(cam.angle*bj_DEGTORAD)
 local real ny = cam.center.y + x*Sin((cam.rotate+90)*bj_DEGTORAD)/(cam.angle*bj_DEGTORAD)
 local real nz = cam.center.z + y
 return Point(nx, ny, nz)
endfunction
function CUpdate takes nothing returns nothing
 local trigger t = GetTriggeringTrigger()
 local CAMERA cam = GetIParam(t, "camera")
 call CAMERA.Update(cam)
endfunction
function InitCamera takes CAMERA cam returns nothing
 local trigger t = CreateTrigger()
 set cam.t = t
 call TriggerRegisterTimerEvent(t, 0.01, true)
 call TriggerAddAction(t, function CUpdate)
 call SetIParam(t, "camera", cam)
endfunction
function StopInitCamera takes CAMERA cam returns nothing
 call DestroyTrigger(cam.t)
endfunction
function CreateCamera takes nothing returns CAMERA 
 return CAMERA.New()
endfunction
function DestroyCamera takes CAMERA cam returns nothing
 call cam.destroy()
endfunction
//BUTTON
struct BUTTON
 POINT p
 CAMERA cam
 unit u
 string model
 string disc
 string name
 trigger t
 trigger click
 trigger even
 player pl
 real x
 real y
 real maxx
 real maxy
 real minx
 real miny
 static method New takes CAMERA cam, real x, real y, string model, player p, string name, string disc, real h, real w returns BUTTON
  local BUTTON this = BUTTON.create()
  set .pl = p
  set .disc = disc
  set .name = name
  set .p = Win2World(cam, x, y)
  set .cam = cam
  set .x = x
  set .y = y
  set .minx = .p.x - w/2
  set .maxx = .p.x + w/2
  set .miny = .p.y - h/2
  set .maxy = .p.y + h/2
  set .u = CreateUn(.pl, 'h000', .p.x, .p.y, .cam.rotate)
  call UnitAddAbility(.u, 'Aloc')
  call AddSpecialEffectTarget(model, .u, "origin")
  call SetUnitZ(.u, .p.z)
  return this
 endmethod
 static method Update takes BUTTON btn returns nothing
  local BUTTON this = btn
  local POINT new = Win2World(.cam, .x, .y)
  call MovePoint(.p, new.x, new.y, new.z)
  call SetUnitPosition(.u, .p.x, .p.y)
  call SetUnitZ(.u, .p.z)
  call SetUnitFacing(.u, .cam.rotate)
  call ClearTextMessages()
  call new.destroy()
 endmethod
endstruct
function BUpdate takes nothing returns nothing
 local trigger t = GetTriggeringTrigger()
 local BUTTON btn = GetIParam(t, "button")
 call BUTTON.Update(btn)
endfunction
function InitButton takes BUTTON btn returns nothing
 local trigger t = CreateTrigger()
 set btn.t = t
 call TriggerRegisterTimerEvent(t, 0.01, true)
 call TriggerAddAction(t, function BUpdate)
 call SetIParam(t, "button", btn)
endfunction
function CreateButton takes CAMERA cam, real x, real y, string model, player p, string name, string disc, real h, real w returns BUTTON
 return BUTTON.New(cam, x, y, model, p, name, disc, h, w)
endfunction
function StopInitButton takes BUTTON btn returns nothing
 call DestroyTrigger(btn.t)
endfunction
Старый 17.02.2009, 15:03
NETRAT

offline
Опыт: 83,712
Активность:
ололо, ну и как по твоему из jass определить разрешение твоего экрана?
Старый 17.02.2009, 15:16
Van Damm
wait... what?
offline
Опыт: 22,268
Активность:
King Ksel, из jass такого не выйдет: функция Джона — то, что тебе нужно. Определить реальное разрешение экрана можно только извне, да и я не пойму, зачем оно может тебе понадобиться, ведь -1...1 удобнее.
Старый 17.02.2009, 15:22
alexprey
познающий Unity
offline
Опыт: 68,501
Активность:
NETRAT, ну это я просто привел пример!
Van Damm, не очень удобно! Т.к придется методом подбора определять ширину иконок!
Если б возвращало бы у Джона координату от центра экрана(нормальную), то тогда другое дело!
И вот еще на заметку! Все экраны - это как подобные прямоугольники, дамножил или разделил на нужный коэфициэнт и все! Размер знать не обязательно!
Старый 17.02.2009, 17:22
NETRAT

offline
Опыт: 83,712
Активность:
Цитата:
Все экраны - это как подобные прямоугольники, дамножил или разделил на нужный коэфициэнт и все! Размер знать не обязательно!
почему тогда у тебя не получается?! и не все - есть 16:9, есть 4:3, есть 16:10 и т.п., у меня, к примеру, 1440*900
Старый 17.02.2009, 17:32
ScorpioT1000
Работаем
offline
Опыт: отключен
Цитата:
не очень удобно! Т.к придется методом подбора определять ширину иконок!

real BUTTON_SIZE_BIG = 0.168
real BUTTON_SIZE_MEDIUM = 0.124
real BUTTON_SIZE_SMALL = 0.08

чтобы сделать кнопку квадратной, делай примерно так:
X: BUTTON_SIZE_BIG / AspectRatio
Y: BUTTON_SIZE_BIG
Старый 17.02.2009, 17:42
Ответ

Опции темы Поиск в этой теме
Поиск в этой теме:

Расширенный поиск

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

BB-коды Вкл.
[IMG] код Вкл.
HTML код Выкл.
Быстрый переход



Часовой пояс GMT +3, время: 05:00.