• Listen to a special audio message from Bill Roper to the Hive Workshop community (Bill is a former Vice President of Blizzard Entertainment, Producer, Designer, Musician, Voice Actor) 🔗Click here to hear his message!
  • Read Evilhog's interview with Gregory Alper, the original composer of the music for WarCraft: Orcs & Humans 🔗Click here to read the full interview.

[Cinematic] Tips and Tricks for the Cinema

Status
Not open for further replies.
Tips 'n' Tricks for the Cinema

Introduction:

Welcome to the Tips 'n' Tricks thread. Here, you can find many tricks for creating cinematics.

Links:
Index:
How to make units fly


Simply using "Set Unit's Fly Height" won't do. The thing is, that the unit must have a "flying" movement type, otherwise it won't work. The only way to achieve this is to add the Storm Crow Form/Crow Form.

The Storm Crow Form adds the "flying" movement type to the unit. So that is the key.

This is what to do:

GUI:
  • Fly
    • Events
    • Conditions
    • Actions
      • Unit - Add Storm Crow Form to <UNIT>
      • Animation - Set <UNIT>'s Flying Height to <height> at <rate>
      • Unit - Remove Storm Crow Form from <UNIT>
  • ----- Note that some of these actions might not be exact -----
This adds the Storm Crow Form, sets the unit's flying height, then it removes the Storm Crow Form, but still has the unit flying.

JASS:
JASS:
function Fly takes unit u, real height, real rate returns nothing
//Function
    call UnitAddAbility(u,'Arav')
//Adds the ability
    call SetUnitFlyHeight(u,height,rate)
//Sets the flying height
    call UnitRemoveAbility(u,'Arav')
//Then it removes the ability because it is not needed, adding/removing it once will suffice to give them the flying movement
endfunction
I believe 'Arav' is the raw code of the Storm Crow spell. I remember it because it is like 'A raven'. That is just easy to remember. You can also use 'Amrf', which is basically the same thing.

You can either use this code or inline it to fit your needs, which is faster but takes a little more lines of coding.

Remember, you only need to add/remove the ability once. You can easily get this auto-done with libraries such as:
AutoFly.

Black Interface


If you have watched some famous cinematics such as Creatures of the Knight, Cult of the Damned, and The Spirit of Vengeance, you'll realize that they have black borders that are used at least once. The borders make your cinematic look much better and look as if they are an actual cinematic. To do this, go to Advanced | Game Interface
advancedgameinterfacehp7.jpg


Then click Use Custom Game Interface.
usecustomgameinterfacecou9.jpg


Scroll down and wait until you see at least one of these:
  • Image - Cinematic Border
    interfacecinematicbordeaa4.jpg
  • Image - Console Background
    interfaceconsolebackgrojt7.jpg
  • Image - Game Menu Background
    interfacegamemenubackgrer7.jpg
Click on each value, click "Use Custom Path", then type out or copy 'n' paste this text:
UI\Widgets\EscMenu\Human\blank-background.blp

If you don't want a black cinematic border, but instead something else such as the border used in "Shipwrecked 1 Revamped - by Med. Map Maker" (Or number 2, I forgot) you can replace only one of them with it. You can keep messing around with those three to see the effects and choose the one you like.

wc3blackbordersdo8.jpg


Cameras

This is simply a brief explanation of cameras, with a little more odd animations. For a better explanation, and example usage (and better animations), refer to:
Cameras.

Cameras are extremely important to cinematics. To create a camera, open the camera palette then click "Create Camera". If you do that, it should say something like "Camera 001". If you right-click it then click "Rename Camera", you can modify it to fit your needs. I will tell you what each field means below:

Camera Name:

Simply the name of the camera, try to make it relevant to what it is doing such as "Park Bench Camera 1".

cameranametb9.jpg

  • Target X - This is the X-coordinate of the camera's target point. Maps are created by several thousands of coordinates, similar to a standard graph. The origin is 0, and it spreads out across the map into tons of coordinates of the quadrants. The "x" value denotes the horizontal location of the camera. These are changed simply by moving the camera around. (changing its position)
  • Target Y - This is the Y-coordinate. In graphs, you have ordered pairs (x,y). This is the y-coordinate, basically the vertical location of the coordinate. Together with x-y coordinates, you can have a point on the map. These are changed simply by moving the camera around. (changing its position)
  • Z-Offset - The height the camera is from the ground. The entire camera is moved upward, and thus has an increased "Z" value. Z-coordinates are basically the height of objects, how high something is from a standard ground-position of 0.
    attachment.php
  • Rotation - This rotates the object. The values to input should be in the range from 1-360 degrees. 90 degrees is facing north, 180 degrees faces west, 270 degrees faces south, and 360/0 degrees faces east.
    attachment.php
  • Angle of Attack - This modifies the angle of viewing. This does not modify the angle from left to right like rotation, but rather from up to down. The range of values is 1-360. 360/0 degrees is directly horizontal, and it parallel to flat ground. As you increase it from 0, it will begin to sink underground and keep changing its angle. At 90 degrees, it will be underground and looking directly upward. At 180 degrees, you'll have an upside down camera that is parallel to flat ground. At 270 it will face directly down at the ground. 304 degrees is the standard game camera AoA. Approximately 345 degrees or so is usually used for RPG-like cameras.
    attachment.php
  • Distance - The distance the camera is from the target point. This has a standard value of 1650. You can get very close though, and pretty far by modifying this value.
    attachment.php
  • Roll - Roll is just like doing a barrel roll in a plane. Or a dog rolling over. The camera rolls over according to the input angle, and can even go upside down. Rolling can create amazing camera effects if used well.
    attachment.php
  • Field of View - This just basically controls the amount of area you see in your camera. Increasing it is kind of like a zoom out. It doesn't really affect the camera itself, but it makes kind of a zoom out effect so more things are on screen.
  • Far Z - This modifies the range in which far objects can be seen. So say there is a tree 10,000 coordinates away. You can set this to 10,000 to be able to see that tree. The maximum is actually 10,000. Even if you set it higher in triggers, it will most likely have the same effect as 10,000. Be careful when doing this though, it may enhance terrain screenshots, but in actual games, you will just be sending a death note to the players. This is probably one of the most impacting visual effects created. If you set it too high, and there are too many objects in view, it can reduce the FPS (frames per second, type /fps in-game) by 20's or possibly more. It depends on the Angle of Attack ultimately, but if there are too many objects seen, then it will generally cause a large amount of lag.
  • Preview Values in Main Window - Basically allows you to actually see what you are altering in the editor while you have the options open. This is very useful for making minor tweaks, without having to rename -> change -> exit -> rename -> change etc. over and over.


Applying Cameras:

You can apply cameras with simple triggers:
  • Camera - Apply <Camera> for Player 1 (Red) over 0.00 seconds
This will apply the camera for the player and will take X seconds to apply. Before you apply another camera, you should wait then apply it:
  • Camera - Apply Camera 1 for Player 1 (Red) over 3.00 seconds
  • Wait 2.00 seconds
  • Camera - Apply Camera 2 for Player 1 (Red) over 2.00 seconds
The reason why I only waited 2.00 seconds was because if I set it to 3.00, the camera will stop then apply. I want it to be much smoother.

For more about cameras, click here

cinematicimagejr4.jpg
Unskippable Transmissions

Many people get angry when some random starts pressing "ESC" repeatedly to skip the transmissions, it can completely ruin a cinematic. However, there is one easy snippet of code which can make all your transmissions unskippable:
JASS:
call DisableTrigger(bj_cineSceneBeingSkipped)

This will basically disable it. To do it in GUI, you use this:
  • Custom script: call DisableTrigger(bj_cineSceneBeingSkipped)
To enable it for whatever reason, use this:
JASS:
call EnableTrigger(bj_cineSceneBeingSkipped)

However, you have to wait until you've made at least one transmission before calling that function. I recommend that you use this neat little snippet:
http://wc3jass.com/5248/snippet-disable-transmission-skip/msg40200/topicseen/#new

Simply place the code in your header (copy the Vanilla JASS Version), and make a trigger on map initialization:
  • My Trigger
    • Events
      • Map Initialization
    • Conditions
    • Actions
      • Custom script: call DisableTransmissionSkip()
And the ESC skipping will be disabled for the rest of the game! (or at least until you call EnableTransmissionSkip())
No Portrait For Transmissions

Sometimes we don't always want portraits to be displayed for our transmissions. You can use these for subtitles, narrators, whatever you want.

Now, this is a very easy method, but many people probably haven't discovered it yet.

To make a transmission with a portrait, you'd do something like this:
  • Cinematic - Send transmission to (All players) from Footman 0003 <gen> named Narrator: Play No sound and display Good evening.. Modify duration: Add 0.00 seconds and Wait
Basically, it sends a transmission from a preplaced unit saying "Good evening". Now, what we want to do is make <Footman 0003> become null, or basically we want no unit.

So replace "Footman 0003" with "Preset: No unit" (or you can use an event response to some event the current trigger doesn't apply to, since that too will return a null value)
  • Cinematic - Send transmission to (All players) from No unit named Narrator: Play No sound and display Good evening.. Modify duration: Add 0.00 seconds and Wait
And voila. It is done.
attachment.php

Filters for One Player/Force

Not too related to cinematics, but many people look for this so I will post the method. Now, there are somewhat two methods (actually, there are many methods branching off the method I discuss), however, the other one might interfere with other GUI functions so I won't discuss it.

For One Player:
We will use GetLocalPlayer() to create it for the player we need.

Basically, we will do this:
  • Set AlphaReal = 0
  • Set TempPlayer = Player 1 (Red)
  • Custom script: if GetLocalPlayer() != udg_TempPlayer then
  • Set AlphaReal = 100
  • Custom script: endif
  • Cinematic - Fade out and back in over 2.00 seconds using texture Black Mask and color (0.00%, 0.00%, 0.00%) with AlphaReal transparency
  • Custom script: call EnableUserUI(true)
Just modify TempPlayer with whatever player you want to be able to see the filter.

What this will do is, if the local player (the player executing the trigger currently) is not Player 1 (Red), then it will set the AlphaReal variable to 100. Basically, this will make the AlphaReal variable out of sync, allowing it to have a different value for Player 1 (Red) opposed to the other players. Thus, it will apply a filter with 0% transparency for Player 1 (Red), and a filter with 100% transparency for everyone else. This way, you can avoid desyncs. If you were to move the "Cinematic - Fade..." into the local player block, it would desync from destroying the timers. Since timers are normally allocated variables with an id > 0x100000 (1048576) it will desync when created/destroyed locally. For more info, view the tutorial I've linked above.
JASS:
function AbortCinematicFadeBJ takes nothing returns nothing
    if (bj_cineFadeContinueTimer != null) then
        call DestroyTimer(bj_cineFadeContinueTimer)
    endif

    if (bj_cineFadeFinishTimer != null) then
        call DestroyTimer(bj_cineFadeFinishTimer)
    endif
endfunction

The last line is optional, but in playable maps you don't want the UI to be disabled by the filter function for all players. If it is intended for a cinematic, you can probably leave that line out or apply it only for the players who don't have the filter displayed:
  • Custom script: if GetLocalPlayer() != udg_TempPlayer then
  • Custom script: call EnableUserUI(true)
  • Custom script: endif
Place that below the filter function.

Note: This will work, but it may bug out (it won't display the filter) if you try to do two filters simultaneously for different players. It won't desync, but one of the filters may not work. Thus, this solution only works if it is being run by itself. For a solution that does not have this issue, see:
http://www.hiveworkshop.com/forums/1676883-post6.html

For One Force:

Sometimes we want to make it for a specific amount of players, and it'd be a little bit stressful to do it with just GetLocalPlayer() == Player(#). This is why we can use forces instead:

  • Actions
    • Set TempForce = (All allies of Player 1 (Red))
    • Set AlphaReal = 100
    • Custom script: if IsPlayerInForce(GetLocalPlayer(),udg_TempForce) then
    • Set AlphaReal = 0
    • Custom script: endif
    • Cinematic - Fade out and back in over 2.00 seconds using texture Black Mask and color (0.00%, 0.00%, 0.00%) with AlphaReal transparency
    • Custom script: call EnableUserUI(true)
Now, if the local player is in the force, we will make the transparency 0, and for everyone else it will remain 100. (TempForce) can be whatever you want, you can manually add it or whatever. All you need to modify is udg_TempForce, just modify after the "udg_" with whatever the name of your force variable is.

About the last line "EnableUserUI()", see the note above under "filter for one player".

Please feel free to post more tips 'n' tricks as well!
 

Attachments

  • narrator.jpg
    narrator.jpg
    42.6 KB · Views: 2,958
  • UI.jpg
    UI.jpg
    125.6 KB · Views: 604
Last edited:
Level 10
Joined
Jul 14, 2004
Messages
463
I saw you also linked my "exact cinematic timing" thread from wc3campaigns. It is outdated... I'll write a new tutorial describing my current method (also used in my contest cinematic "The Premonition") soon.

Another tip concerning camera movement: If you make bigger sways over more than one camerasetup station, you will notice that everytime you apply a new camera, there will be an edge in movement. I wrote a system to prevent this ugly edges from occuring - here it is: Dragonblood Creations' Camera System.
Its application is basically the same than with the normal "apply camera x over y seconds", but it offers smooth acceleration and braking. Take a look at it, it should be a great help especially for advanced cinematic makers.
 
Level 1
Joined
Jan 8, 2008
Messages
1
Can anybody help me with cinematics like. characters talking during cinematic and how to make units move
 
Level 1
Joined
Jun 26, 2009
Messages
2
Here is a -little- common trick I always use to showup some pics over the screen.
First import the picture.
then, In the trigger Editor (since I know nothing about Jass) do the following:
Set the "event" and "condition" on what you need or want, then in the "action" list add
"Cinematic-Fade Filter"
In the "action text" change "white mask" to your imported pic! press ok and you are done!
This is the very basic, the event, condition and even adding some additional actions depends on your work!
 
@LordPerenoldeII, Why would someone use floating text in a cinematic? <.<

He might mean just for credits. =P I could post that, I might eventually.

EDIT: I've added the "no portrait" technique as well as a method to create filters for only one player/force.

EDIT2: I've added how to create a filter without disabling the UI.
 
Last edited:
Level 22
Joined
Nov 20, 2005
Messages
1,219
He might mean just for credits. =P I could post that, I might eventually.
Exactly ;) that's what i did for the very first time in my proj.

EDIT: I've added the "no portrait" technique as well as a method to create filters for only one player/force.

EDIT2: I've added how to create a filter without disabling the UI.

What do you mean "create filters"? And what's the "no portrait" technique? Sorry but it is very interesting and i'd wish to learn cinematic's deepest secrets in any way necessary.
One more thing: I added a picture in a custom cinematic filter but it only appear a bit blurred, not bright as the original pic is. Am i doin something wrong?
 
For the no portrait - Basically, when you send a transmission, they will ping the unit and then use the unit's portrait model inside the transmission box. If you don't want any portrait to be displayed (just black as shown) then you just use "No Unit" as described.

EDIT: Filter with UI. Hmm... I didn't test it thoroughly enough. lol It doesn't do what I wanted it to do. (actually, it just doesn't do anything as far as I can tell) So I'll remove that portion. =)

>I added a picture in a custom cinematic filter but it only appear a bit blurred, not bright as the original pic is. Am i doin something wrong?

Make sure all the RGB values are at 100% and that the transparency is 0%. Also, it will definitely reduce the quality so it will be blurry when enlarged on the screen.
 
Last edited:
Level 22
Joined
Nov 20, 2005
Messages
1,219
For the no portrait - Basically, when you send a transmission, they will ping the unit and then use the unit's portrait model inside the transmission box. If you don't want any portrait to be displayed (just black as shown) then you just use "No Unit" as described.
heyy ye-ye-ye i just did the same some time ago to hide a talking boss cinematic(so that the player cannot see it before the right time to face it ;)). It makes an excellent anti-spoiler.
>I added a picture in a custom cinematic filter but it only appear a bit blurred, not bright as the original pic is. Am i doin something wrong?

Make sure all the RGB values are at 100% and that the transparency is 0%. Also, it will definitely reduce the quality so it will be blurry when enlarged on the screen.


I already checked RGB levels, but you have to be more specific as well. There are two levels settings: before and after the image-filter. So what should i do?
What i mean for blurred: it's not the stretching; it's something else, related to the map maybe. There's like a dark-blue shroud that blurs a bit the image(its colours are not as bright as it is originally). Could it probably be something related to the extension of the imported file(which in this case it's jpg)?
 
Level 24
Joined
Jun 14, 2005
Messages
2,506
I already checked RGB levels, but you have to be more specific as well. There are two levels settings: before and after the image-filter. So what should i do?
What i mean for blurred: it's not the stretching; it's something else, related to the map maybe. There's like a dark-blue shroud that blurs a bit the image(its colours are not as bright as it is originally). Could it probably be something related to the extension of the imported file(which in this case it's jpg)?

Fade Filters are unfortunately affected by Warcraft's day/night models, meaning that when it's night in game fade filters are affected, usually resulting in the loss of brightness you described. Unfortunately the only real workaround for this is to make it daytime, as the light model for daytime doesn't affect fade filters.
 
Level 24
Joined
Jun 14, 2005
Messages
2,506
Well I just remembered that Anitarf's Cinematic System does actually support unshaded fade filters, however that means that you would have to redo your cinematic so that it uses the system. Heres a link if your interested: http://www.wc3c.net/showthread.php?t=79554

My understanding is that the system works by placing an unshaded model in front of the camera, however I can't remember if this method supports images or if it can only be used for coloured fade filters.
 
Level 11
Joined
Oct 13, 2008
Messages
560
how can I do/remove one fade filter only for one Variable unit
Like:
  • Using the Ability
    • Event
      • Unit - Unit starts the effect on and abylit
    • Conditions
      • (Ability Begin Cast) equal to (my ability)
    • Actions
      • Set (one variable) = triggering unit
      • Cinematic - Create the fade filter only for the owner of (one Variable)
other trigger:


  • Removing the Fade
    • Events
      • Time - Every 0.01 seconds on the game
    • Conditions
      • Boolean - (one variable) has a buff (my buff) equal to false
    • Actions
      • Cinematic - (Remove fade filter from owner of (one Variable))
 
That is discussed in the first post. (Look for "Fade Filter for One Player/Force") ;)

This is how it would be done:
  • Spell
    • Events
      • Unit - A unit starts the effect of an ability
    • Conditions
      • (Ability Being Cast) Equal to YourSpell
    • Actions
      • Set AlphaReal = 0
      • Custom script: if GetLocalPlayer() != GetTriggerPlayer() then
      • Set AlphaReal = 100
      • Custom script: endif
      • Cinematic - Fade out and back in over 2.00 seconds using texture White Mask and color (100.00%, 100.00%, 100.00%) with AlphaReal transparency
AlphaReal is a real-type variable made in the variable editor. You can modify the fade filter action however you'd like. This should show it for only the player of the unit casting the spell.
 
Level 11
Joined
Oct 13, 2008
Messages
560
but if I don't want cast one spell every time to usa the fade filter?
I want create one UNIT variable, and every time(like one Periodic Event) create the fade filter for the OWNER of this unit in variable, I wan't know hot to do some think like

  • Set Unidade = Paladin
  • Custom script: if GetLocalPlayer() == GetOwningPlayer(GetUnidade()) then
  • set (...)
but this GetUnidade don't works...

how can I do some think like this?
 
but if I don't want cast one spell every time to usa the fade filter?
I want create one UNIT variable, and every time(like one Periodic Event) create the fade filter for the OWNER of this unit in variable, I wan't know hot to do some think like

  • Set Unidade = Paladin
  • Custom script: if GetLocalPlayer() == GetOwningPlayer(GetUnidade()) then
  • set (...)
but this GetUnidade don't works...

how can I do some think like this?

You would replace GetOwningPlayer(GetUnidade()) with GetOwningPlayer(udg_Unidade).
 
Status
Not open for further replies.
Top