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

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

Ответ
 
MartinMC

offline
Опыт: 6,005
Активность:
3D-камера и неровности рельефа
Люди в общем у меня проблема, у мя камера от 3 лица и есть такая проблема, при вхождении чела на воду или приближении к горе камера поднимается или опускается (в варе такое есть, при развитии там если на гору каму навести она немного поднимится.) Как это убрать или прикрыть, использую систему 3D движение на стрелках, но каму сделал сам. Помогите плиз, если есть фикс, залейте.
Старый 14.03.2009, 14:24
MartinMC

offline
Опыт: 6,005
Активность:
Код:
function Trig_camera_Func003Func001Func008C takes nothing returns boolean
    if ( not ( ( GetLocationZ(PolarProjectionBJ(GetUnitLoc(udg_Geroi[udg_CHISLO[13]]), -400.00, udg_Direction[udg_CHISLO[13]])) - GetLocationZ(GetUnitLoc(udg_Geroi[udg_CHISLO[13]])) ) > 200.00 ) ) then
        return false
    endif
    return true
endfunction

function Trig_camera_Func003Func001C takes nothing returns boolean
    if ( not ( udg_Geroi[udg_CHISLO[13]] != null ) ) then
        return false
    endif
    return true
endfunction

function Trig_camera_Actions takes nothing returns nothing
    local location loc
    local real HeroZ
    set udg_CHISLO[13] = 1
    loop
        exitwhen udg_CHISLO[13] > 12
        if ( Trig_camera_Func003Func001C() ) then
            set loc =  (GetUnitLoc(udg_Geroi[udg_CHISLO[13]]))
            set HeroZ = GetLocationZ(loc)
            call RemoveLocation(loc)
            call SetCameraTargetControllerNoZForPlayer( ConvertedPlayer(udg_CHISLO[13]), udg_Geroi[( udg_CHISLO[13] + 12 )], 0.00, 0.00, false )
            call SetCameraFieldForPlayer( ConvertedPlayer(udg_CHISLO[13]), CAMERA_FIELD_TARGET_DISTANCE, 450.00, 0.25 )
            call SetCameraFieldForPlayer( ConvertedPlayer(udg_CHISLO[13]), CAMERA_FIELD_ZOFFSET, HeroZ, 0.25 )
            call SetCameraFieldForPlayer( ConvertedPlayer(udg_CHISLO[13]), CAMERA_FIELD_ROTATION, GetUnitFacing(udg_Geroi[( udg_CHISLO[13] + 12 )]), 0.25 )
            if ( Trig_camera_Func003Func001Func008C() ) then
                call SetCameraFieldForPlayer( ConvertedPlayer(udg_CHISLO[13]), CAMERA_FIELD_ANGLE_OF_ATTACK, -50.00, 0.25 )
            else
                call SetCameraFieldForPlayer( ConvertedPlayer(udg_CHISLO[13]), CAMERA_FIELD_ANGLE_OF_ATTACK, -25.00, 0.25 )
            endif
        else
        endif
        set udg_CHISLO[13] = udg_CHISLO[13] + 1
    endloop
endfunction

//===========================================================================
function InitTrig_camera takes nothing returns nothing
    set gg_trg_camera = CreateTrigger(  )
    call TriggerRegisterTimerEventPeriodic( gg_trg_camera, 0.04 )
    call TriggerAddAction( gg_trg_camera, function Trig_camera_Actions )
endfunction


MartinMC добавил:
там CHISLO это с гером связанно, мне прост нужен код чтоб камера намертво прикрепилась под 1 углом и не дергалась при вхождении в воду или подходу к горе или на нее.

MartinMC добавил:
скорпио а как это как код оформитЬ?

MartinMC добавил:
Эни ван кен хелп ми плиз? Срочно нуно решение.

Отредактировано MartinMC, 14.03.2009 в 15:00.
Старый 14.03.2009, 15:24
IceInfernal
...где распостерся мрак
offline
Опыт: 2,317
Активность:
Возможно как-то так
» code
Код:
function Trig_camera_Func003Func001C takes nothing returns boolean
    if ( not ( udg_Geroi[udg_CHISLO[13]] != null ) ) then
        return false
    endif
    return true
endfunction

function Trig_camera_Actions takes nothing returns nothing
    local location loc
    local real HeroZ
    set udg_CHISLO[13] = 1
    loop
        exitwhen udg_CHISLO[13] > 12
        if ( Trig_camera_Func003Func001C() ) then
            set loc =  (GetUnitLoc(udg_Geroi[udg_CHISLO[13]]))
            set HeroZ = GetLocationZ(loc)
            call RemoveLocation(loc)
            call SetCameraTargetControllerNoZForPlayer( ConvertedPlayer(udg_CHISLO[13]), udg_Geroi[( udg_CHISLO[13] + 12 )], 0.00, 0.00, false )
            call SetCameraFieldForPlayer( ConvertedPlayer(udg_CHISLO[13]), CAMERA_FIELD_TARGET_DISTANCE, 450.00, 0.25 )
            call SetCameraFieldForPlayer( ConvertedPlayer(udg_CHISLO[13]), CAMERA_FIELD_ZOFFSET, HeroZ, 0.25 )
            call SetCameraFieldForPlayer( ConvertedPlayer(udg_CHISLO[13]), CAMERA_FIELD_ROTATION, GetUnitFacing(udg_Geroi[( udg_CHISLO[13] + 12 )]), 0.25 )
        else
        endif
        set udg_CHISLO[13] = udg_CHISLO[13] + 1
    endloop
endfunction

//===========================================================================
function InitTrig_camera takes nothing returns nothing
    set gg_trg_camera = CreateTrigger(  )
    call TriggerRegisterTimerEventPeriodic( gg_trg_camera, 0.04 )
    call TriggerAddAction( gg_trg_camera, function Trig_camera_Actions )
endfunction
Старый 14.03.2009, 15:29
MartinMC

offline
Опыт: 6,005
Активность:
нет, неподхдит, эффект тотже

MartinMC добавил:
MF_Andreich както это сделал... Но я непойму в его системе ничего, мнебы фиксующий фрагмент вытащить.

[http://xgm.guru/forum/showthread.php?t=17378]

Отредактировано Dron, 14.03.2009 в 19:59.
Старый 14.03.2009, 16:05
J
expert
offline
Опыт: 48,447
Активность:
поразбирайсе в камере что есть в DGUI
удали атуда все матрици и методы от них почисти, и будет то что тебе надо
Старый 14.03.2009, 21:03
MartinMC

offline
Опыт: 6,005
Активность:
Я в джасе ниче не понимаю =(

MartinMC добавил:
вот триг я хз как его перевести в стандарт из джас нью ген
Код:
//TESH.scrollpos=0
//TESH.alwaysfold=0

library Camera initializer Init requires Math

globals
    private constant integer TypeUnit = 'dgui'
    private location GL4Cam = Location(0,0)
    private unit AtUnit = null
    private real DeltaZ = 0
endglobals

globals
    private constant real Width = 0.544
    private constant real Height = 0.302
endglobals

private function Matrix4Perspective1 takes MATRIX4 Output, real fovy, real Aspect, real zn, real zf returns MATRIX4
    return Output.SetValues(2*zn/fovy,0,0,0,0,2*zn/Aspect,0,0,0,0,zf/(zf-zn),1,0,0,zn*zf/(zn-zf),0)
endfunction

private function Matrix4Perspective2 takes MATRIX4 Output, real n, real f, real r, real l, real t, real b returns MATRIX4
    return Output.SetValues(2*n/(r-l), 0, (r+l)/(r-l), 0, 0, 2*n/(t-b), (t+b)/(t-b), 0, 0, 0, -(f+n)/(f-n), -2*f*n/(f-n), 0, 0, -1, 0)
endfunction

private function Matrix4Look takes MATRIX4 Output, VECTOR3 PosCamera, VECTOR3 AxisX, VECTOR3 AxisY, VECTOR3 AxisZ returns MATRIX4
    return Output.SetValues(AxisX.x,AxisY.x,AxisZ.x,0,AxisX.y,AxisY.y,AxisZ.y,0,AxisX.z,Axi  sY.z,AxisZ.z,0,-Vec3Dot(AxisX, PosCamera),-Vec3Dot(AxisY, PosCamera),-Vec3Dot(AxisZ, PosCamera),1)
endfunction

struct CAMERA
    VECTOR3 Eye
    VECTOR3 At
    real Distance
    real Yaw
    real Pitch
    real Roll
    VECTOR3 AxisX
    VECTOR3 AxisY
    VECTOR3 AxisZ
    private MATRIX4 View
    private MATRIX4 Projection
    
    method Win2World takes real X, real Y, real Range returns VECTOR3
        local VECTOR3 Output = VECTOR3.create()
        set Output.x = .Eye.x+.AxisZ.x*Range+X*.AxisX.x*Width*Range+Y*.AxisY.x*Height*Range
        set Output.y = .Eye.y+.AxisZ.y*Range+X*.AxisX.y*Width*Range+Y*.AxisY.y*Height*Range
        set Output.z = .Eye.z+.AxisZ.z*Range+X*.AxisX.z*Width*Range+Y*.AxisY.z*Height*Range
        return Output
    endmethod

    method World2Win takes real X, real Y, real Z returns VECTOR3
        local VECTOR3 Pos = VECTOR3.New_1(X, Y, Z)
        local boolean b
        call Vec3Transform_2(Pos, Pos, .View)
        set b = Pos.z < 0
        call Vec3Transform_2(Pos, Pos, .Projection)
        if b then
            set Pos.z = -Pos.z
        endif
        return Pos
    endmethod
    
    private method UpdateDistanceYawPitch takes nothing returns nothing
        local real dx = .At.x-.Eye.x
        local real dy = .At.y-.Eye.y
        local real dz = .At.z-.Eye.z
        local real len2d
        set .Distance = SquareRoot(dx*dx+dy*dy+dz*dz)
        set .Yaw = Atan2(dy, dx)
        set len2d = SquareRoot(dx*dx+dy*dy)
        set .Pitch = Atan2(dz, len2d)
    endmethod
    
    private method UpdateAxisMatrix takes nothing returns nothing
        local MATRIX3 mat
        call Vec3Normalize(.AxisZ, Vec3Subtract(.AxisZ, .At, .Eye))
        set mat = Matrix3RotationAxis(MATRIX3.create(), .AxisZ, -.Roll)
        call Vec3Normalize(.AxisX, Vec3Cross(.AxisX, .AxisZ, VECTOR3.oneZ))
        call Vec3Transform_1(.AxisY, Vec3Cross(.AxisY, .AxisX, .AxisZ), mat)
        call Vec3Transform_1(.AxisX, .AxisX, mat)
        call Matrix4Look(.View, .Eye, .AxisX, .AxisY, .AxisZ)
        call mat.destroy()
    endmethod

    method ApplyCameraForPlayer takes player p returns nothing
        if GetLocalPlayer() == p then
            call SetCameraField(CAMERA_FIELD_ROTATION, .Yaw*bj_RADTODEG, 0)
            call SetCameraField(CAMERA_FIELD_ANGLE_OF_ATTACK, .Pitch*bj_RADTODEG, 0)
            call SetCameraField(CAMERA_FIELD_ROLL, .Roll*bj_RADTODEG, 0)
            call SetCameraField(CAMERA_FIELD_TARGET_DISTANCE, .Distance, 0)
            call SetCameraTargetController(AtUnit, .At.x, .At.y, false)
            call SetCameraField(CAMERA_FIELD_ZOFFSET, .At.z-DeltaZ, 0)
        endif
    endmethod

    method SetPosition takes real x, real y, real z returns nothing
        local real dx = x-.At.x
        local real dy = y-.At.y
        local real dz = z-.At.z
        set .Eye.x = .Eye.x+dx
        set .Eye.y = .Eye.y+dy
        set .Eye.z = .Eye.z+dz
        set .At.x = x
        set .At.y = y
        set .At.z = z
    endmethod
    
    method SetEyeAndAt takes real ex, real ey, real ez, real tx, real ty, real tz returns nothing
        set .Eye.x = ex
        set .Eye.y = ey
        set .Eye.z = ez
        set .At.x = tx
        set .At.y = ty
        set .At.z = tz
        call .UpdateDistanceYawPitch()
        call .UpdateAxisMatrix()
    endmethod
    
    method SetYawPitchRoll takes real yaw, real pitch, real roll, boolean EyeLock returns nothing
        local real Z = .Distance*Sin(pitch)
        local real XY = .Distance*Cos(pitch)
        local real X = XY*Cos(yaw)
        local real Y = XY*Sin(yaw)
        set .Yaw = yaw
        set .Pitch = pitch
        set .Roll = roll
        if EyeLock then
            set .At.x = .Eye.x+X
            set .At.y = .Eye.y+Y
            set .At.z = .Eye.z+Z
        else
            set .Eye.x = .At.x-X
            set .Eye.y = .At.y-Y
            set .Eye.z = .At.z-Z
        endif
        call .UpdateAxisMatrix()
    endmethod
    
    static method New takes nothing returns CAMERA
        local CAMERA this = CAMERA.create()
        set .Eye = VECTOR3.New_1(0.0,-922.668,DeltaZ+1367.912)
        set .At = VECTOR3.New_1(0, 0, DeltaZ)
        set .Distance = 0
        set .Yaw = 0
        set .Pitch = 0
        set .Roll = 0
        set .AxisX = VECTOR3.create()
        set .AxisY = VECTOR3.create()
        set .AxisZ = VECTOR3.create()
        set .View  = MATRIX4.create()
        set .Projection = Matrix4Perspective2(MATRIX4.create(), 0.5, 10000, -Width/2, Width/2, -Height/2, Height/2)
        call .UpdateDistanceYawPitch()
        call .UpdateAxisMatrix()
        return this
    endmethod
    
    method Delete takes nothing returns nothing
        call .Eye.destroy()
        call .At.destroy()
        call .AxisX.destroy()
        call .AxisY.destroy()
        call .AxisZ.destroy()
        call .View.destroy()
        call .Projection.destroy()
        call this.destroy()
    endmethod
    
endstruct

globals
    private real TempX = 0
    private real TempY = 0
endglobals
private function InitDeltaZ_Timer takes nothing returns nothing
    set DeltaZ = GetCameraTargetPositionZ()
    call SetCameraPosition(TempX, TempY)
    call DestroyTimer(GetExpiredTimer())
endfunction
function InitDeltaZ takes nothing returns nothing
    set TempX = GetCameraTargetPositionX()
    set TempY = GetCameraTargetPositionY()
    call SetCameraPosition(0, 0)
    call TimerStart(CreateTimer(), 0.04, false, function InitDeltaZ_Timer)
endfunction

private function Init takes nothing returns nothing
    set AtUnit = CreateUnit(Player(15), TypeUnit, 0, 0, 0)
    call SetUnitAloc(AtUnit)
    call ShowUnit(AtUnit, false)
    call InitDeltaZ()
endfunction

endlibrary
Старый 15.03.2009, 12:34
J
expert
offline
Опыт: 48,447
Активность:
нужно джаз понимать, иначе ты не сделаеш что просишь
в никакой стандарт переводить не надо, посути стандарт на текущий момент это vjass
вот если убрать из камера матрицы, чтобы не мешались, получается это:
(единственное нельзя использовать камеру в первые 0,1 секунд игры)
» code
Код:
library Camera initializer Init

globals
    private constant integer TypeUnit = 'xxxx' // Сдесь указывай любой тип дами-юнита пустышкы
    private location GL4Cam = Location(0,0)
    private unit AtUnit = null
    private real DeltaZ = 0
endglobals

struct CAMERA
    real EyeX
    real EyeY
    real EyeZ
    real AtX
    real AtY
    real AtZ
    real Distance
    real Yaw
    real Pitch
    real Roll
    
    private method UpdateDistanceYawPitch takes nothing returns nothing
        local real dx = .AtX-.EyeX
        local real dy = .AtY-.EyeY
        local real dz = .AtZ-.EyeZ
        local real len2d
        set .Distance = SquareRoot(dx*dx+dy*dy+dz*dz)
        set .Yaw = Atan2(dy, dx)
        set len2d = SquareRoot(dx*dx+dy*dy)
        set .Pitch = Atan2(dz, len2d)
    endmethod

    method ApplyCameraForPlayer takes player p returns nothing
        if GetLocalPlayer() == p then
            call SetCameraField(CAMERA_FIELD_ROTATION, .Yaw*bj_RADTODEG, 0)
            call SetCameraField(CAMERA_FIELD_ANGLE_OF_ATTACK, .Pitch*bj_RADTODEG, 0)
            call SetCameraField(CAMERA_FIELD_ROLL, .Roll*bj_RADTODEG, 0)
            call SetCameraField(CAMERA_FIELD_TARGET_DISTANCE, .Distance, 0)
            call SetCameraTargetController(AtUnit, .AtX, .AtY, false)
            call SetCameraField(CAMERA_FIELD_ZOFFSET, .AtZ-DeltaZ, 0)
        endif
    endmethod

    method SetPosition takes real x, real y, real z returns nothing
        local real dx = x-.AtX
        local real dy = y-.AtY
        local real dz = z-.AtZ
        set .EyeX = .EyeX+dx
        set .EyeY = .EyeY+dy
        set .EyeZ = .EyeZ+dz
        set .AtX = x
        set .AtY = y
        set .AtZ = z
    endmethod
    
    method SetEyeAndAt takes real ex, real ey, real ez, real tx, real ty, real tz returns nothing
        set .EyeX = ex
        set .EyeY = ey
        set .EyeZ = ez
        set .AtX = tx
        set .AtY = ty
        set .AtZ = tz
        call .UpdateDistanceYawPitch()
    endmethod
    
    method SetYawPitchRoll takes real yaw, real pitch, real roll, boolean EyeLock returns nothing
        local real Z = .Distance*Sin(pitch)
        local real XY = .Distance*Cos(pitch)
        local real X = XY*Cos(yaw)
        local real Y = XY*Sin(yaw)
        set .Yaw = yaw
        set .Pitch = pitch
        set .Roll = roll
        if EyeLock then
            set .AtX = .EyeZ+X
            set .AtY = .EyeY+Y
            set .AtZ = .EyeX+Z
        else
            set .EyeX = .AtX-X
            set .EyeY = .AtY-Y
            set .EyeZ = .AtZ-Z
        endif
    endmethod
    
    static method Reset takes nothing returns nothing
        set .EyeX = 0.0
        set .EyeY = -922.668
        set .EyeZ = DeltaZ+1367.912
        set .AtX = 0.0
        set .AtY = 0.0
        set .AtZ = DeltaZ
        set .Distance = 0
        set .Yaw = 0
        set .Pitch = 0
        set .Roll = 0
        call .UpdateDistanceYawPitch()
    endmethod
    
endstruct

globals
    private real TempX = 0
    private real TempY = 0
endglobals
private function InitDeltaZ_Timer takes nothing returns nothing
    set DeltaZ = GetCameraTargetPositionZ()
    call SetCameraPosition(TempX, TempY)
    call DestroyTimer(GetExpiredTimer())
endfunction
function InitDeltaZ takes nothing returns nothing
    set TempX = GetCameraTargetPositionX()
    set TempY = GetCameraTargetPositionY()
    call SetCameraPosition(0, 0)
    call TimerStart(CreateTimer(), 0.04, false, function InitDeltaZ_Timer)
endfunction

private function Init takes nothing returns nothing
    set AtUnit = CreateUnit(Player(15), TypeUnit, 0, 0, 0)
    call SetUnitAloc(AtUnit)
    call ShowUnit(AtUnit, false)
    call InitDeltaZ()
endfunction

endlibrary
Старый 15.03.2009, 12:51
MartinMC

offline
Опыт: 6,005
Активность:
Всеравно мапа его не принимает и не может сохранитьт (пишет кучу ошибок) и типа нету строки Инит триг.
Старый 15.03.2009, 13:00
J
expert
offline
Опыт: 48,447
Активность:
jnpg тебе в помыщ
Старый 15.03.2009, 13:01
MartinMC

offline
Опыт: 6,005
Активность:
Цитата:
jnpg тебе в помыщ

После сохранения в jnpg сохраняю и при загрузке любой мапы из кампании появляется черный экран и 0 эмоций. Кампании не принимают джаспак. Покрайней мере у меня.
Старый 15.03.2009, 13:08
arko59
начинающий Jass'ер
offline
Опыт: 1,066
Активность:
MartinMC, вот хорошая наработка
Старый 15.03.2009, 21:00
MartinMC

offline
Опыт: 6,005
Активность:
Цитата:
нет, неподхдит, эффект тотже

Цитата:
Всеравно мапа его не принимает и не может сохранитьт (пишет кучу ошибок) и типа нету строки Инит триг.

Цитата:
После сохранения в jnpg сохраняю и при загрузке любой мапы из кампании появляется черный экран и 0 эмоций. Кампании не принимают джаспак. Покрайней мере у меня.


MartinMC добавил:
461 ошибок компиля и 4 ошибки нет строки инит триг.
Старый 15.03.2009, 21:52
MartinMC

offline
Опыт: 6,005
Активность:
So, подведем итоги. Довольно простой триг джасеры не могут создать за 5 минут по 3 причинам:
-Они просто упрямятся, не хотев помочь проэкту. (В хорошем смысле этого выражения)
-Им просто лень (ибо 5 минут это слишком много) Опятьже в хорошем смысле.
-Их профессионализм не позволяет им помогать никому кроме самих себя и писать столь мелкие триги.
Убиваюсь об стену, хотябы фрагмент кода мне бы (не на JNGP).
плз.
Старый 16.03.2009, 21:54
arko59
начинающий Jass'ер
offline
Опыт: 1,066
Активность:
MartinMC, скопируй мою наработку и в триггере "init" смени строку:
» раскрыть
Код:
scope Init initializer Init
    private function Actions takes nothing returns nothing
        local integer i = 0
        local unit u
        
        call FogEnable(false)
        call FogMaskEnable(false)
        call SetSkyModel("Environment\\Sky\\Sky\\SkyLight.mdl")
        
        loop
            exitwhen i == 12
            if GetPlayerSlotState(Player(i)) == PLAYER_SLOT_STATE_PLAYING and GetPlayerController(Player(i)) == MAP_CONTROL_USER then
                set u = //!!!ТВОЙ ЮНИТ!!!
                call ThirdPersonCam_Use(Player(i), u, 0)
            endif
            set i = i+1
        endloop
        set u = null
    endfunction

    private function Init takes nothing returns nothing
        set gg_trg_Init = CreateTrigger()
        call TriggerAddAction(gg_trg_Init, function Actions)
    endfunction

endscope

он должен без ошибок работать. У тебя jngp есть?

arko59 добавил:
баз него не рабит вроде
Старый 17.03.2009, 16:03
MartinMC

offline
Опыт: 6,005
Активность:
убейте меня, 9 раз: просьба не jngp
Старый 18.03.2009, 17:06
Ответ

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

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

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

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



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