This is a very basic tutorial showing how to get a basic model into Arma 3.
*Required Programs*
Arma 3 (Obviously...)
Arma 3 Tools
If you don't know how to get Arma 3 tools then open Steam, go to the library tab and go down to tools. The tools are alphabetical so it should be at the top of the list.
*Recommenced Programs*
Notepad++ - Notepad++ is a free (as in "free speech" and also as in "free beer") source code editor and Notepad replacement that supports several languages. DOWNLOAD AND ALWAYS USE FOR EVERTHING!!!!!!!
3DS Max - 3DS Max is a professional 3D computer graphics program for making 3D animations, models, games and images. You can get the free version by going to http://www.autodesk.com/ and signing up for a student version of 3DS Max.
Blender - Blender is a professional free and open-source 3D computer graphics software product used for creating animated films, visual effects, art, 3D printed models, interactive 3D applications and video games. Basically it's the free version of 3DS Max just with a more simple interface.
SketchUp - (formerly: Google Sketchup) is a 3D modeling program for applications such as architectural, interior design, civil and mechanical engineering, film, and video game design. This is the most simple and cheapest 3D modeling program. Highly recommended for those just starting and need to get a feel for things.
To get the best modeling experience use 3DS Max or Blender.
To get started we are going to need a couple of files. Make a new folder called "A3_Projects" (Without the "" duhhh). Inside that folder make another folder called "Mailbox". Inside Mailbox make four files. basicDefines_A3.hpp, cfgPatches.hpp, config.cpp, and config_macros_glass.hpp. To open, right click any of the files and either click "edit", for those without NotePad++. For those who have NotePad++ right click and select edit with NotePad++.
Now for the fun stuff. The code you see below start putting that into the files.
basicDefines_A3.hpp
#define true 1
#define false 0
#define VSoft 0
#define VArmor 1
#define VAir 2
// type scope
#define private 0
#define protected 1
#define public 2
#define CanSeeRadar 1
#define CanSeeEye 2
#define CanSeeOptics 4
#define CanSeeEar 8
#define CanSeeCompass 16
#define CanSeeRadarC CanSeeRadar+CanSeeCompass
#define CanSeeAll 31
#define CanSeePeripheral 32
//lock acquiring
#define manualLA 0
#define automaticLA 1
//lockable target type
#define lockGroundTT 0
#define lockAirGroundTT 1
#define lockAirTT 2
#define lockGround 0
#define lockAirGround 1
#define lockAir 2
//missile lock type
#define fireAndForgetLT 0
#define keepLockedLT 1
#define manualLT 2
#define SPEED_STATIC 1e10
#define LockNo 0
#define LockCadet 1
#define LockYes 2
enum {StabilizedInAxesNone,StabilizedInAxisX,StabilizedInAxisY,StabilizedInAxesBoth, StabilizedInAxesXYZ};
#define StabilizedInAxesNone 0
#define StabilizedInAxisX 1
#define StabilizedInAxisY 2
#define StabilizedInAxesBoth 3
#define StabilizedInAxesXYZ 4
#define CM_none 0
#define CM_Lock_Visual 1
#define CM_Lock_IR 2
#define CM_Lock_Laser 4
#define CM_Lock_Radar 8
#define CM_Missile 16
#define CMImmunity_GOOD 0.9
#define CMImmunity_MIDDLE 0.65
#define CMImmunity_BAD 0.5
#define mag_xx(a,b) class _xx_##a {magazine = a; count = b;}
#define weap_xx(a,b) class _xx_##a {weapon = a; count = b;}
#define item_xx(a,b) class _xx_##a {name = a; count = b;}
#define bag_xx(a,b) class _xx_##a {backpack = a; count = b;}
#define DEFAULT_SLOT 0
#define MUZZLE_SLOT 101
#define OPTICS_SLOT 201
#define FLASHLIGHT_SLOT 301
#define NVG_SLOT 602
#define GOGGLE_SLOT 603
#define HEADGEAR_SLOT 605
#define UNIFORM_SLOT 801
#define HMD_SLOT 616
#define BINOCULAR_SLOT 617
#define MEDIKIT_SLOT 619
#define RADIO_SLOT 611
#define VEST_SLOT 701
#define BACKPACK_SLOT 901
#define LOAD(weight,capacity) maximumLoad = ##capacity##; \
mass = ##weight##;
#define HeadArmourCoef 2.5
#define BodyArmourCoef 10
#define HandArmourCoef 5
#define LegArmourCoef 5
cfgPatches.hpp
class CfgPatches
{
class Mailbox
{
requiredAddons[] = {"A3_Structures_F"};
requiredVersion = 0.1;
units[] =
{
"Mailbox"
};
weapons[] = {};
};
};
config.cpp
#include "basicdefines_A3.hpp"
#include "config_macros_glass.hpp"
#include "cfgPatches.hpp"
class CfgVehicles
{
class House;
class House_F: House
{
class DestructionEffects;
};
class Ruins_F;
class Mailbox: House_F
{
scope = 2;
displayName = "Mailbox";
model = Mailbox\Mailbox.p3d; // filepath
vehicleClass = Structures; // Object in the in-game editor
mapSize = 20.27;
cost = 40000;
class DestructionEffects: DestructionEffects
{
};
class HitPoints
{
};
class Damage
{
};
class UserActions
{
};
};
};
config_macros_glass.hpp
#define DOOR_GLASS_HITPOINT(glassID,arm,rad) \
class Glass_##glassID##_hitpoint \
{ \
armor = arm; \
material = -1; \
name = Glass_##glassID; \
visual = Glass_##glassID##_hide; \
passThrough = 0; \
radius = rad; \
convexComponent = Glass_##glassID##_hide; \
class DestructionEffects \
{ \
class BrokenGlass1 \
{ \
simulation = "particles"; \
type = "BrokenGlass1ND"; \
position = Glass_##glassID##_effects; \
intensity = 0.15000001; \
interval = 1; \
lifeTime = 0.05; \
}; \
class BrokenGlass2: BrokenGlass1 \
{ \
type = "BrokenGlass2ND"; \
}; \
class BrokenGlass3: BrokenGlass1 \
{ \
type = "BrokenGlass3ND"; \
}; \
class BrokenGlass4: BrokenGlass1 \
{ \
type = "BrokenGlass4ND"; \
}; \
class BrokenGlass5: BrokenGlass1 \
{ \
type = "BrokenGlass5ND"; \
}; \
class BrokenGlass6: BrokenGlass1 \
{ \
type = "BrokenGlass6ND"; \
}; \
class BrokenGlass7: BrokenGlass1 \
{ \
type = "BrokenGlass7ND"; \
}; \
class BrokenGlass1S: BrokenGlass1 \
{ \
type = "BrokenGlass1SD"; \
}; \
class BrokenGlass2S: BrokenGlass1 \
{ \
type = "BrokenGlass2SD"; \
}; \
class BrokenGlass3S: BrokenGlass1 \
{ \
type = "BrokenGlass3SD"; \
}; \
class BrokenGlass4S: BrokenGlass1 \
{ \
type = "BrokenGlass4SD"; \
}; \
class BrokenGlass5S: BrokenGlass1 \
{ \
type = "BrokenGlass5SD"; \
}; \
class BrokenGlass6S: BrokenGlass1 \
{ \
type = "BrokenGlass6SD"; \
}; \
class BrokenGlass7S: BrokenGlass1 \
{ \
type = "BrokenGlass7SD"; \
}; \
}; \
};
#define BIG_GLASS_HITPOINT(glassID,arm,rad) \
class Glass_##glassID##_hitpoint \
{ \
armor = arm; \
material = -1; \
name = Glass_##glassID; \
visual = Glass_##glassID##_hide; \
passThrough = 0; \
radius = rad; \
convexComponent = Glass_##glassID##_hide; \
class DestructionEffects \
{ \
class BrokenGlass1 \
{ \
simulation = "particles"; \
type = "BrokenGlass1NB"; \
position = Glass_##glassID##_effects; \
intensity = 0.15000001; \
interval = 1; \
lifeTime = 0.05; \
}; \
class BrokenGlass2: BrokenGlass1 \
{ \
type = "BrokenGlass2NB"; \
}; \
class BrokenGlass3: BrokenGlass1 \
{ \
type = "BrokenGlass3NB"; \
}; \
class BrokenGlass4: BrokenGlass1 \
{ \
type = "BrokenGlass4NB"; \
}; \
class BrokenGlass5: BrokenGlass1 \
{ \
type = "BrokenGlass5NB"; \
}; \
class BrokenGlass6: BrokenGlass1 \
{ \
type = "BrokenGlass6NB"; \
}; \
class BrokenGlass7: BrokenGlass1 \
{ \
type = "BrokenGlass7NB"; \
}; \
class BrokenGlass1S: BrokenGlass1 \
{ \
type = "BrokenGlass1SB"; \
}; \
class BrokenGlass2S: BrokenGlass1 \
{ \
type = "BrokenGlass2SB"; \
}; \
class BrokenGlass3S: BrokenGlass1 \
{ \
type = "BrokenGlass3SB"; \
}; \
class BrokenGlass4S: BrokenGlass1 \
{ \
type = "BrokenGlass4SB"; \
}; \
class BrokenGlass5S: BrokenGlass1 \
{ \
type = "BrokenGlass5SB"; \
}; \
class BrokenGlass6S: BrokenGlass1 \
{ \
type = "BrokenGlass6SB"; \
}; \
class BrokenGlass7S: BrokenGlass1 \
{ \
type = "BrokenGlass7SB"; \
}; \
}; \
};
#define NORMAL_GLASS_HITPOINT(glassID,arm,rad) \
class Glass_##glassID##_hitpoint \
{ \
armor = arm; \
material = -1; \
name = Glass_##glassID; \
visual = Glass_##glassID##_hide; \
passThrough = 0; \
radius = rad; \
convexComponent = Glass_##glassID##_hide; \
class DestructionEffects \
{ \
class BrokenGlass1 \
{ \
simulation = "particles"; \
type = "BrokenGlass1NN"; \
position = Glass_##glassID##_effects; \
intensity = 0.15000001; \
interval = 1; \
lifeTime = 0.05; \
}; \
class BrokenGlass2: BrokenGlass1 \
{ \
type = "BrokenGlass2NN"; \
}; \
class BrokenGlass3: BrokenGlass1 \
{ \
type = "BrokenGlass3NN"; \
}; \
class BrokenGlass4: BrokenGlass1 \
{ \
type = "BrokenGlass4NN"; \
}; \
class BrokenGlass5: BrokenGlass1 \
{ \
type = "BrokenGlass5NN"; \
}; \
class BrokenGlass6: BrokenGlass1 \
{ \
type = "BrokenGlass6NN"; \
}; \
class BrokenGlass7: BrokenGlass1 \
{ \
type = "BrokenGlass7NN"; \
}; \
class BrokenGlass1S: BrokenGlass1 \
{ \
type = "BrokenGlass1SN"; \
}; \
class BrokenGlass2S: BrokenGlass1 \
{ \
type = "BrokenGlass2SN"; \
}; \
class BrokenGlass3S: BrokenGlass1 \
{ \
type = "BrokenGlass3SN"; \
}; \
class BrokenGlass4S: BrokenGlass1 \
{ \
type = "BrokenGlass4SN"; \
}; \
class BrokenGlass5S: BrokenGlass1 \
{ \
type = "BrokenGlass5SN"; \
}; \
class BrokenGlass6S: BrokenGlass1 \
{ \
type = "BrokenGlass6SN"; \
}; \
class BrokenGlass7S: BrokenGlass1 \
{ \
type = "BrokenGlass7SN"; \
}; \
}; \
};
Now that you have those files ready we can begin the modeling phase.
*SketchUp*
To being we are going to start off the most easy to use program.
Step 1 - Creating Your Object
First, open sketup and delete the man. With sketchup you can make the models your self and you can go to the 3D warehouse and download models that people have made and uploaded for your use.
We're going to make a basic model, a square. So first, select the rectangle tool and click and drag on the ground. Try not to make it to big as we are just testing our model. Next use the "push/pull" tool to raise your modeling. Make sure to hold shift and click on top of your model. Also make sure the model is white and not gray. If the model is gray you'll be able to see through the model in-game. To fix this right click on the part that's gray and click reverse face. Great! We have a basic object created! With the object finished we can now export it to a .3DS file. To do this click "File, Export, 3D Model" and put it in the A3_Projects folder.
Step 2 - Getting Your Modeling into Oxygen 2.
Go to Steam, Tools, and open Arma 3 tools and click Lauch Object Builder.
Once inside object builder click file, import, 3D Studio. This menu should appear : http://gyazo.com/05c6f6a0728fcd4634cd791f88202bff Click the box to the left of where it says "Model". Click No merge. Then click import. There should be a red dot in the middle of the grid. That's the object. Right now it's pretty small so we have to change that. Go to points, Transform 2D, scale. Change it to 20 and check use pin. 20 might be to small or to big for your model so change the number and click preview to make sure it's not to big.
Right now we have a object/model which we can get into game. So let's get it into game! Click file save as and find your A3_Projects folder and inside the folder named Mailbox, save the .p3d file as Mailbox.p3d. (Make sure to delete the .3DS file before moving onto the next step)
Step 3 - Making the .PBO
Close Oxygen 2/Object builder and launch addon builder. In the addon source directory find your "A3_Projects\Mailbox". Make sure you click the Mailbox folder then hit OK. Destination directory set to your desktop (will be moved later). Now for the final thing click options and in the list of files to copy directly put this in the line *.pac;*.paa;*.rtm;*.sqf;*.sqs;*.tga;*.fsm;*.wss;*.ogg;*.wav;*.fxy;*.csv;*.html;*.lip;*.txt;*.cpp;*.hpp;*.p3d
This is to make sure that all the files will be packed into the PBO. Hit PACK and you're DONE!
Find your object in game by entering the editor setting your player down and selecting empty and scroll down to structures and you should see something called "Mailbox".
Here's what my model looked like - http://gyazo.com/e736ba3d2f5654cf5d69eef8fff0751d