NovaBryan/EVE_Dump
Log | Files | 📦 下载最新源码 (.zip) | Refs | README

explosionCamera.py (9586B)


      1 #Embedded file name: C:\BuildAgent\work\20d73f1b24eed06e\eve\release\V24.01\eve\client\script\ui\camera\explosionCamera.py
      2 import random
      3 import math
      4 from eve.client.script.ui.camera.baseSpaceCamera import BaseSpaceCamera
      5 from eve.client.script.ui.camera.cameraUtil import GetBall, GetBallPosition
      6 from eve.client.script.ui.view.viewStateConst import ViewState
      7 import evecamera
      8 import blue
      9 import geo2
     10 from evegraphics.explosions.spaceObjectExplosionManager import SpaceObjectExplosionManager
     11 from carbonui.uicore import uicore
     12 BOUNDING_SPHERE_MULTIPLICATION = 20
     13 
     14 def MiddlePoint(endPos, startPos):
     15     return geo2.Vec3Scale(geo2.Vec3Direction(endPos, startPos), geo2.Vec3Distance(startPos, endPos) * 0.5)
     16 
     17 
     18 class ExplosionCamera(BaseSpaceCamera):
     19     cameraID = evecamera.CAM_EXPLOSION
     20     name = 'ExplosionCamera'
     21 
     22     def __init__(self):
     23         BaseSpaceCamera.__init__(self)
     24         self.msUntilGlobal = 0.0
     25         self.interest = None
     26         self.startTime = 0
     27         self.isRunning = False
     28         self.animateCamera = False
     29         self.endTime = 0
     30         self.p0, self.p1, self.p2, self.p3, self.p4 = (None, None, None, None, None)
     31 
     32     def ResetCamera(self):
     33         self.p0, self.p1, self.p2, self.p3, self.p4 = (None, None, None, None, None)
     34         self.startTime = 0
     35         self.isRunning = False
     36         self.animateCamera = False
     37         self.endTime = 0.0
     38         self.msUntilGlobal = 0.0
     39 
     40     def OnActivated(self, lastCamera = None, itemID = None, **kwargs):
     41         BaseSpaceCamera.OnActivated(self, **kwargs)
     42         if lastCamera and lastCamera.cameraID in evecamera.INSPACE_CAMERAS:
     43             self.SetAtPosition(lastCamera.atPosition)
     44             self.SetEyePosition(lastCamera.eyePosition)
     45             self.interest = itemID
     46             self.fov = lastCamera.fov
     47         self.SetFovTarget(self.default_fov)
     48         SpaceObjectExplosionManager.GetExplosionTimesWhenAvailable(itemID, self.SetTimes)
     49 
     50     def SetTimes(self, globalExplosionStart, wreckSwitchTime):
     51         self.startTime = blue.os.GetSimTime()
     52         self.msUntilGlobal = float(blue.os.TimeDiffInMs(self.startTime, long(globalExplosionStart))) * 1.2
     53         self.CalculatePoints()
     54         if self.animateCamera:
     55             velocity = geo2.Vec3Distance(self.p0, self.p2) / max(self.msUntilGlobal, 100)
     56             self.endTime = self.msUntilGlobal + min(geo2.Vec3Distance(self.p2, self.p3) / velocity, 5000)
     57         self.isRunning = True
     58 
     59     def Update(self):
     60         if not self.isRunning:
     61             BaseSpaceCamera.Update(self)
     62             return
     63         egoBall = GetBall(self.ego)
     64         if egoBall is None:
     65             self.isRunning = False
     66             return
     67         if not self.animateCamera:
     68             egoPos = GetBallPosition(egoBall)
     69             self.Transit(self.atPosition, self.eyePosition, egoPos, self.eyePosition, 3.0, callback=self.SwitchToPrimaryCamera)
     70             self.isRunning = False
     71         else:
     72             interestBall = GetBall(self.interest)
     73             if interestBall is None:
     74                 self.isRunning = True
     75                 return
     76             t = float(blue.os.TimeDiffInMs(self.startTime, blue.os.GetSimTime()))
     77             self.atPosition = GetBallPosition(interestBall)
     78             if t < self.msUntilGlobal:
     79                 self.eyePosition = self.GetSplinePosition(t / self.msUntilGlobal, self.p0, self.p1, self.p2)
     80             elif t < self.endTime:
     81                 frac = (t - self.msUntilGlobal) / (self.endTime - self.msUntilGlobal)
     82                 self.eyePosition = self.GetPosBetweenTwoPoints(frac, self.p2, self.p3)
     83             else:
     84                 egoPos = GetBallPosition(egoBall)
     85                 self.Transit(self.atPosition, self.p3, egoPos, self.p3, 5.0, callback=self.SwitchToPrimaryCamera)
     86                 self.isRunning = False
     87         BaseSpaceCamera.Update(self)
     88 
     89     def GetPosBetweenTwoPoints(self, frac, p0, p1):
     90         invFrac = 1 - frac
     91         p0Influence = geo2.Vec3Scale(p0, invFrac)
     92         p1Influence = geo2.Vec3Scale(p1, frac)
     93         newPoint = geo2.Vec3Add(p0Influence, p1Influence)
     94         return newPoint
     95 
     96     def GetSplinePosition(self, frac, p0, p1, p2):
     97         invFrac = 1 - frac
     98         p0Influence = geo2.Vec3Scale(p0, invFrac * invFrac)
     99         p1Influence = geo2.Vec3Scale(p1, 2.0 * frac * invFrac)
    100         p2Influence = geo2.Vec3Scale(p2, frac * frac)
    101         newPoint = geo2.Vec3Add(p0Influence, geo2.Vec3Add(p1Influence, p2Influence))
    102         return newPoint
    103 
    104     def CalculatePoints(self):
    105         startBall = GetBall(self.interest)
    106         startPos = GetBallPosition(startBall)
    107         egoBall = GetBall(self.ego)
    108         endPos = GetBallPosition(egoBall)
    109         offset = geo2.Vec3Subtract(endPos, startPos)
    110         if self.GetDistanceFromLookAt() > geo2.Vec3Length(offset):
    111             self.animateCamera = False
    112             return
    113         self.animateCamera = True
    114         distanceFromLookAt = self.GetDistanceFromLookAt()
    115         self.p0 = self.eyePosition
    116         self.p3 = self._GetNewLookAtEyePosWithPositionInView(endPos, max(distanceFromLookAt, egoBall.radius * 5.0), startPos)
    117         shipBasedBounds = startBall.radius * BOUNDING_SPHERE_MULTIPLICATION
    118         if geo2.Vec3DistanceSq(endPos, startPos) < geo2.Vec3DistanceSq(endPos, self.p0):
    119             if distanceFromLookAt < shipBasedBounds:
    120                 self.SetupOrbitTrackInsideOfBounds(distanceFromLookAt, shipBasedBounds)
    121             else:
    122                 self.SetupOrbitTrackOutsideOfBounds(distanceFromLookAt)
    123         elif distanceFromLookAt < shipBasedBounds:
    124             self.SetupTranslationTrackInsideOfBounds(distanceFromLookAt, shipBasedBounds)
    125         else:
    126             self.SetupTranslationTrackOutsideOfBounds()
    127 
    128     def SetupOrbitTrackInsideOfBounds(self, distanceFromLookAt, bounds):
    129         perpendicularDirection = self.FindPerpendicularDirection(self.eyePosition, self.atPosition, self.p3)
    130         self.p1 = geo2.Vec3Add(self.atPosition, geo2.Vec3Scale(perpendicularDirection, distanceFromLookAt))
    131         lengthToBounds = bounds * bounds - distanceFromLookAt * distanceFromLookAt
    132         lengthFromP1ToP3 = geo2.Vec3DistanceSq(self.p1, self.p3)
    133         if lengthToBounds > lengthFromP1ToP3:
    134             self.p2 = self.p3
    135         else:
    136             p1ToP3 = geo2.Vec3Direction(self.p3, self.p1)
    137             self.p2 = geo2.Vec3Add(self.p1, geo2.Vec3Scale(p1ToP3, math.sqrt(lengthToBounds)))
    138 
    139     def SetupTranslationTrackInsideOfBounds(self, distanceFromLookAt, bounds):
    140         perpendicularDirection = self.FindPerpendicularDirection(self.eyePosition, self.atPosition, self.p3)
    141         perpendicularPos = geo2.Vec3Add(self.atPosition, geo2.Vec3Scale(perpendicularDirection, distanceFromLookAt))
    142         lengthToBounds = bounds * bounds - distanceFromLookAt * distanceFromLookAt
    143         lengthFromP1ToP3 = geo2.Vec3DistanceSq(perpendicularPos, self.p3)
    144         if lengthToBounds > lengthFromP1ToP3:
    145             self.p2 = self.p3
    146         else:
    147             p1ToP3 = geo2.Vec3Direction(self.p3, perpendicularPos)
    148             self.p2 = geo2.Vec3Add(self.atPosition, geo2.Vec3Scale(p1ToP3, math.sqrt(lengthToBounds)))
    149         self.p1 = geo2.Vec3Add(self.p0, MiddlePoint(self.p2, self.p0))
    150 
    151     def SetupOrbitTrackOutsideOfBounds(self, distanceFromLookAt):
    152         perpendicularDirection = self.FindPerpendicularDirection(self.eyePosition, self.atPosition, self.p3)
    153         self.p2 = geo2.Vec3Add(self.atPosition, geo2.Vec3Scale(perpendicularDirection, distanceFromLookAt))
    154         self.p1 = geo2.Vec3Add(self.p0, MiddlePoint(self.p2, self.p0))
    155 
    156     def SetupTranslationTrackOutsideOfBounds(self):
    157         self.p1 = self.GetPosBetweenTwoPoints(0.1, self.p0, self.p3)
    158         self.p2 = self.GetPosBetweenTwoPoints(0.2, self.p0, self.p3)
    159 
    160     def FindPerpendicularDirection(self, eyePosition, atPosition, point):
    161         eyeToAt = geo2.Vec3Subtract(atPosition, eyePosition)
    162         eyeToPoint = geo2.Vec3Subtract(point, eyePosition)
    163         scale = geo2.Vec3Dot(eyeToPoint, eyeToAt) / geo2.Vec3Dot(eyeToAt, eyeToAt)
    164         closestPointOnLine = geo2.Vec3Add(eyePosition, geo2.Vec3Scale(eyeToAt, scale))
    165         direction = geo2.Vec3Direction(point, closestPointOnLine)
    166         return direction
    167 
    168     def SwitchToPrimaryCamera(self):
    169         spaceCamera = sm.GetService('viewState').GetView(ViewState.Space).ActivatePrimaryCamera()
    170         if self.animateCamera:
    171             spaceCamera.eyePosition = self.eyePosition
    172             spaceCamera.atPosition = self.atPosition
    173         self.ResetCamera()
    174         return spaceCamera
    175 
    176     def OnDeactivated(self):
    177         BaseSpaceCamera.OnDeactivated(self)
    178         uicore.animations.StopAllAnimations(self)
    179 
    180     def Track(self, itemID, **kwargs):
    181         cam = self.SwitchToPrimaryCamera()
    182         if cam:
    183             cam.Track(itemID)
    184 
    185     def LookAt(self, itemID, **kwargs):
    186         cam = self.SwitchToPrimaryCamera()
    187         if cam:
    188             cam.LookAt(itemID, **kwargs)
    189 
    190     def LookAtMaintainDistance(self, itemID):
    191         pass
    192 
    193     def _GetNewLookAtEyePosWithPositionInView(self, atPos1, radius, interestPosition):
    194         vectorDiff = geo2.Vec3Subtract(atPos1, interestPosition)
    195         fov = self.fov - self.fovOffset
    196         angleToRotate = -fov * 0.65
    197         randomness = 0.5 * random.random()
    198         invRandomness = 0.5 - randomness
    199         rotation = geo2.MatrixMultiply(geo2.MatrixRotationX(angleToRotate * randomness), geo2.MatrixRotationY(angleToRotate * invRandomness))
    200         newEyeDir = geo2.Vec3Normalize(vectorDiff)
    201         newEyeDir = geo2.Vec3Transform(newEyeDir, rotation)
    202         return geo2.Vec3Add(geo2.Vec3Scale(newEyeDir, radius), atPos1)