added animation of a shell to the game
- in BattleShipServer class added serialization of the AnimationMessage classs - added to VoidVisitor and Visitor the Shell class - edited the ServerGameLogic class to implement a new Animation state (see new Server-State-Chart) - added a new client state AnimationState (see new Client-State-Chart)
This commit is contained in:
@@ -10,7 +10,6 @@
|
||||
import com.jme3.app.DebugKeysAppState;
|
||||
import com.jme3.app.SimpleApplication;
|
||||
import com.jme3.app.StatsAppState;
|
||||
import com.jme3.audio.AudioNode;
|
||||
import com.jme3.font.BitmapFont;
|
||||
import com.jme3.font.BitmapText;
|
||||
import com.jme3.input.KeyInput;
|
||||
|
||||
@@ -34,6 +34,7 @@ public class GameSound extends AbstractAppState implements GameEventListener {
|
||||
private AudioNode splashSound;
|
||||
private AudioNode shipDestroyedSound;
|
||||
private AudioNode explosionSound;
|
||||
private AudioNode shellFiredSound;
|
||||
|
||||
/**
|
||||
* Checks if sound is enabled in the preferences.
|
||||
@@ -78,6 +79,7 @@ public void initialize(AppStateManager stateManager, Application app) {
|
||||
shipDestroyedSound = loadSound(app, "Sound/Effects/sunken.wav"); //NON-NLS
|
||||
splashSound = loadSound(app, "Sound/Effects/splash.wav"); //NON-NLS
|
||||
explosionSound = loadSound(app, "Sound/Effects/explosion.wav"); //NON-NLS
|
||||
shellFiredSound = loadSound(app, "Sound/Effects/missle.wav"); //NON-NLS
|
||||
}
|
||||
|
||||
/**
|
||||
@@ -93,8 +95,7 @@ private AudioNode loadSound(Application app, String name) {
|
||||
sound.setLooping(false);
|
||||
sound.setPositional(false);
|
||||
return sound;
|
||||
}
|
||||
catch (AssetLoadException | AssetNotFoundException ex) {
|
||||
} catch (AssetLoadException | AssetNotFoundException ex) {
|
||||
LOGGER.log(Level.ERROR, ex.getMessage(), ex);
|
||||
}
|
||||
return null;
|
||||
@@ -124,12 +125,21 @@ public void shipDestroyed() {
|
||||
shipDestroyedSound.playInstance();
|
||||
}
|
||||
|
||||
/**
|
||||
* Plays sound effect when a shell has been fired.
|
||||
*/
|
||||
public void shellFired() {
|
||||
if (isEnabled() && shellFiredSound != null)
|
||||
shellFiredSound.playInstance();
|
||||
}
|
||||
|
||||
@Override
|
||||
public void receivedEvent(SoundEvent event) {
|
||||
switch (event.sound()) {
|
||||
case EXPLOSION -> explosion();
|
||||
case SPLASH -> splash();
|
||||
case DESTROYED_SHIP -> shipDestroyed();
|
||||
case SHELL_FIRED -> shellFired();
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
@@ -143,6 +143,10 @@ public float getHeight() {
|
||||
return FIELD_SIZE * map.getHeight();
|
||||
}
|
||||
|
||||
public static float getFieldSize() {
|
||||
return FIELD_SIZE;
|
||||
}
|
||||
|
||||
/**
|
||||
* Converts coordinates from view coordinates to model coordinates.
|
||||
*
|
||||
|
||||
@@ -7,14 +7,20 @@
|
||||
|
||||
package pp.battleship.client.gui;
|
||||
|
||||
import com.jme3.material.Material;
|
||||
import com.jme3.material.RenderState;
|
||||
import com.jme3.math.ColorRGBA;
|
||||
import com.jme3.scene.Geometry;
|
||||
import com.jme3.scene.Node;
|
||||
import com.jme3.scene.Spatial;
|
||||
import com.jme3.scene.shape.Sphere;
|
||||
import pp.battleship.model.Battleship;
|
||||
import pp.battleship.model.Shell;
|
||||
import pp.battleship.model.Shot;
|
||||
import pp.util.Position;
|
||||
|
||||
import static com.jme3.material.Materials.UNSHADED;
|
||||
|
||||
/**
|
||||
* Synchronizes the visual representation of the ship map with the game model.
|
||||
* It handles the rendering of ships and shots on the map view, updating the view
|
||||
@@ -65,9 +71,9 @@ public Spatial visit(Shot shot) {
|
||||
|
||||
// Create and return a rectangle representing the shot
|
||||
return view.getApp().getDraw().makeRectangle(p1.getX(), p1.getY(),
|
||||
SHOT_DEPTH,
|
||||
p2.getX() - p1.getX(), p2.getY() - p1.getY(),
|
||||
color);
|
||||
SHOT_DEPTH,
|
||||
p2.getX() - p1.getX(), p2.getY() - p1.getY(),
|
||||
color);
|
||||
}
|
||||
|
||||
/**
|
||||
@@ -109,6 +115,25 @@ public Spatial visit(Battleship ship) {
|
||||
return shipNode;
|
||||
}
|
||||
|
||||
/**
|
||||
* Creates a visual representation of a shell on the map.
|
||||
* The shell is represented as a black ellipse.
|
||||
*
|
||||
* @param shell the Shell object representing the shell in the model
|
||||
* @return a Spatial representing the shell on the map
|
||||
*/
|
||||
@Override
|
||||
public Spatial visit(Shell shell) {
|
||||
Geometry ellipse = new Geometry("ellipse", new Sphere(50, 50, MapView.getFieldSize() / 2 * 0.8f));
|
||||
Material mat = new Material(view.getApp().getAssetManager(), UNSHADED); //NON-NLS
|
||||
mat.getAdditionalRenderState().setBlendMode(RenderState.BlendMode.Alpha);
|
||||
mat.getAdditionalRenderState().setFaceCullMode(RenderState.FaceCullMode.Off);
|
||||
mat.setColor("Color", ColorRGBA.Black);
|
||||
ellipse.setMaterial(mat);
|
||||
ellipse.addControl(new ShellMapControl(view, shell));
|
||||
return ellipse;
|
||||
}
|
||||
|
||||
/**
|
||||
* Creates a line geometry representing part of the ship's border.
|
||||
*
|
||||
|
||||
@@ -20,10 +20,7 @@
|
||||
import com.jme3.scene.Spatial;
|
||||
import com.jme3.scene.shape.Box;
|
||||
import pp.battleship.client.BattleshipApp;
|
||||
import pp.battleship.model.Battleship;
|
||||
import pp.battleship.model.Rotation;
|
||||
import pp.battleship.model.ShipMap;
|
||||
import pp.battleship.model.Shot;
|
||||
import pp.battleship.model.*;
|
||||
|
||||
import static java.util.Objects.requireNonNull;
|
||||
import static pp.util.FloatMath.HALF_PI;
|
||||
@@ -35,8 +32,7 @@
|
||||
* It extends the {@link ShipMapSynchronizer} to provide specific synchronization
|
||||
* logic for the sea map.
|
||||
*/
|
||||
class SeaSynchronizer extends ShipMapSynchronizer { ;
|
||||
|
||||
class SeaSynchronizer extends ShipMapSynchronizer {
|
||||
private static final String UNSHADED = "Common/MatDefs/Misc/Unshaded.j3md"; //NON-NLS
|
||||
private static final String KING_GEORGE_V_MODEL = "Models/KingGeorgeV/KingGeorgeV.j3o"; //NON-NLS
|
||||
private static final String DESTROYER_MODEL = "Models/Destroyer/Destroyer.j3o"; //NON-NLS
|
||||
@@ -44,8 +40,11 @@ class SeaSynchronizer extends ShipMapSynchronizer { ;
|
||||
private static final String TYPE_II_UBOAT_MODEL = "Models/TypeIIUboat/TypeIIUboat.j3o"; //NON-NLS
|
||||
private static final String TYPE_II_UBOAT_TEXTURE = "Models/TypeIIUboat/Type_II_U-boat_diff.jpg"; //NON-NLS
|
||||
private static final String ATLANTICA_MODEL = "Models/Atlantica/Atlantica.j3o"; //NON-NLS
|
||||
private static final String ROCKET = "Models/Rocket/Rocket.j3o"; //NON-NLS
|
||||
|
||||
private static final String COLOR = "Color"; //NON-NLS
|
||||
private static final String SHIP = "ship"; //NON-NLS
|
||||
private static final String SHELL = "shell"; //NON-NLS
|
||||
private static final ColorRGBA BOX_COLOR = ColorRGBA.Gray;
|
||||
|
||||
private final ShipMap map;
|
||||
@@ -176,6 +175,36 @@ private ParticleEmitter createFireEffect(Shot shot, Node shipNode) {
|
||||
return fire;
|
||||
}
|
||||
|
||||
/**
|
||||
* Visits a {@link Shell} and creates a graphical representation of it.
|
||||
* The shell is represented as a node with a model attached to it.
|
||||
* The node is then positioned and controlled by a {@link ShellControl}.
|
||||
*
|
||||
* @param shell the shell to be represented
|
||||
* @return the node containing the graphical representation of the shell
|
||||
*/
|
||||
@Override
|
||||
public Spatial visit(Shell shell) {
|
||||
final Node node = new Node(SHELL);
|
||||
node.attachChild(createShell());
|
||||
node.setLocalTranslation(shell.getY() + 0.5f, 10f, shell.getX() + 0.5f);
|
||||
node.addControl(new ShellControl());
|
||||
return node;
|
||||
}
|
||||
|
||||
/**
|
||||
* Creates a graphical representation of a shell.
|
||||
*
|
||||
* @return the spatial representing the shell
|
||||
*/
|
||||
private Spatial createShell() {
|
||||
final Spatial model = app.getAssetManager().loadModel(ROCKET);
|
||||
model.scale(0.0025f);
|
||||
model.rotate(PI, 0f, 0f);
|
||||
model.setShadowMode(ShadowMode.CastAndReceive);
|
||||
return model;
|
||||
}
|
||||
|
||||
/**
|
||||
* Visits a {@link Battleship} and creates a graphical representation of it.
|
||||
* The representation is either a 3D model or a simple box depending on the
|
||||
|
||||
@@ -0,0 +1,42 @@
|
||||
package pp.battleship.client.gui;
|
||||
|
||||
import com.jme3.renderer.RenderManager;
|
||||
import com.jme3.renderer.ViewPort;
|
||||
import com.jme3.scene.control.AbstractControl;
|
||||
|
||||
/**
|
||||
* Controls the movement and rotation of a shell in the game.
|
||||
* The shell moves downward at a constant speed and rotates around its Y-axis.
|
||||
* When the shell reaches a certain Y-coordinate, it is removed from its parent node.
|
||||
*/
|
||||
public class ShellControl extends AbstractControl {
|
||||
private final static float SHELL_SPEED = 7.5f;
|
||||
private final static float SHELL_ROTATION_SPEED = 0.5f;
|
||||
private final static float MIN_HEIGHT = 0.7f;
|
||||
|
||||
/**
|
||||
* Updates the shell's position and rotation.
|
||||
* If the shell's Y-coordinate is less than or equal to 1.0, it is detached from its parent node.
|
||||
*
|
||||
* @param tpf time per frame, used to ensure consistent movement speed across different frame rates
|
||||
*/
|
||||
@Override
|
||||
protected void controlUpdate(float tpf) {
|
||||
spatial.move(0, -SHELL_SPEED * tpf, 0);
|
||||
spatial.rotate(0, SHELL_ROTATION_SPEED, 0);
|
||||
if (spatial.getLocalTranslation().getY() <= MIN_HEIGHT) {
|
||||
spatial.getParent().detachChild(spatial);
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* Renders the shell. This method is currently not used.
|
||||
*
|
||||
* @param rm the RenderManager
|
||||
* @param vp the ViewPort
|
||||
*/
|
||||
@Override
|
||||
protected void controlRender(RenderManager rm, ViewPort vp) {
|
||||
// nothing to do here
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,82 @@
|
||||
package pp.battleship.client.gui;
|
||||
|
||||
import com.jme3.math.Vector3f;
|
||||
import com.jme3.renderer.RenderManager;
|
||||
import com.jme3.renderer.ViewPort;
|
||||
import com.jme3.scene.control.AbstractControl;
|
||||
import pp.battleship.model.Shell;
|
||||
import pp.util.Position;
|
||||
|
||||
import java.lang.System.Logger;
|
||||
import java.lang.System.Logger.Level;
|
||||
|
||||
/**
|
||||
* Controls the animation of a shell in the map view.
|
||||
* This class handles the movement of a shell from its starting position to its target position
|
||||
* using linear interpolation over a specified duration.
|
||||
*/
|
||||
public class ShellMapControl extends AbstractControl {
|
||||
private static final Logger LOGGER = System.getLogger(ShellMapControl.class.getName());
|
||||
|
||||
/**
|
||||
* The duration of the shell animation in seconds.
|
||||
*/
|
||||
private final static float ANIMATION_DURATION = 0.8f;
|
||||
|
||||
/**
|
||||
* The end position of the shell in the map view.
|
||||
*/
|
||||
private final Position endPos;
|
||||
|
||||
/**
|
||||
* The progress of the shell's movement, ranging from 0 to 1.
|
||||
*/
|
||||
private float progress = 0f;
|
||||
|
||||
/**
|
||||
* Constructs a new instance of {@link ShellMapControl}.
|
||||
*
|
||||
* @param view the map view
|
||||
* @param shell the shell to be controlled
|
||||
*/
|
||||
public ShellMapControl(MapView view, Shell shell) {
|
||||
Vector3f endPos = new Vector3f(shell.getX(), 0, shell.getY());
|
||||
this.endPos = view.modelToView(endPos.x, endPos.z);
|
||||
LOGGER.log(Level.DEBUG, "ShellMapControl created with endPos: " + this.endPos);
|
||||
}
|
||||
|
||||
/**
|
||||
* Updates the position of the shell in the view with linear interpolation.
|
||||
* This method is called during the update phase.
|
||||
*
|
||||
* @param tpf the time per frame
|
||||
*/
|
||||
@Override
|
||||
protected void controlUpdate(float tpf) {
|
||||
// adjust speed by changing the multiplier
|
||||
progress += tpf * ANIMATION_DURATION;
|
||||
|
||||
// progress is between 0 and 1
|
||||
if (progress > 1f) {
|
||||
progress = 1f;
|
||||
}
|
||||
|
||||
// linearly interpolate the current position between (0, 0) and endPos
|
||||
float newX = (1 - progress) * 0 + progress * endPos.getX() + MapView.getFieldSize() / 2;
|
||||
float newZ = (1 - progress) * 0 + progress * endPos.getY() + MapView.getFieldSize() / 2;
|
||||
|
||||
spatial.setLocalTranslation(newX, newZ, 0);
|
||||
}
|
||||
|
||||
/**
|
||||
* This method is called during the render phase.
|
||||
* Currently, it does nothing.
|
||||
*
|
||||
* @param rm the RenderManager
|
||||
* @param vp the ViewPort
|
||||
*/
|
||||
@Override
|
||||
protected void controlRender(RenderManager rm, ViewPort vp) {
|
||||
// nothing to do here
|
||||
}
|
||||
}
|
||||
File diff suppressed because it is too large
Load Diff
@@ -0,0 +1,250 @@
|
||||
#
|
||||
# Generated by Sweet Home 3D - ven. janv. 02 20:37:08 CET 2015
|
||||
# http://www.sweethome3d.com/
|
||||
#
|
||||
|
||||
newmtl FrontColorNoCulling
|
||||
illum 1
|
||||
Ka 0.2 0.2 0.2
|
||||
Kd 0.2 0.2 0.2
|
||||
Ks 0.0 0.0 0.0
|
||||
Ns 0.0
|
||||
|
||||
newmtl ForegroundColor
|
||||
illum 1
|
||||
Ka 0.2 0.2 0.2
|
||||
Kd 0.2 0.2 0.2
|
||||
Ks 0.0 0.0 0.0
|
||||
Ns 0.0
|
||||
|
||||
newmtl white
|
||||
illum 1
|
||||
Ka 0.48235294 0.5019608 0.5803922
|
||||
Kd 0.48235294 0.5019608 0.5803922
|
||||
Ks 0.0 0.0 0.0
|
||||
Ns 0.0
|
||||
|
||||
newmtl white_Cylinder_5
|
||||
illum 1
|
||||
Ka 0.47843137 0.49803922 0.5764706
|
||||
Kd 0.47843137 0.49803922 0.5764706
|
||||
Ks 0.0 0.0 0.0
|
||||
Ns 0.0
|
||||
|
||||
newmtl white_Cylinder_10
|
||||
illum 1
|
||||
Ka 0.8784314 0.8745098 0.8901961
|
||||
Kd 0.8784314 0.8745098 0.8901961
|
||||
Ks 0.0 0.0 0.0
|
||||
Ns 0.0
|
||||
|
||||
newmtl FrontColorNoCulling_11
|
||||
illum 1
|
||||
Ka 0.8784314 0.8745098 0.8901961
|
||||
Kd 0.8784314 0.8745098 0.8901961
|
||||
Ks 0.0 0.0 0.0
|
||||
Ns 0.0
|
||||
|
||||
newmtl ForegroundColor_12
|
||||
illum 1
|
||||
Ka 0.8784314 0.8745098 0.8901961
|
||||
Kd 0.8784314 0.8745098 0.8901961
|
||||
Ks 0.0 0.0 0.0
|
||||
Ns 0.0
|
||||
|
||||
newmtl white_Mesh_13
|
||||
illum 1
|
||||
Ka 0.6 0.6 0.6
|
||||
Kd 0.6 0.6 0.6
|
||||
Ks 0.0 0.0 0.0
|
||||
Ns 0.0
|
||||
|
||||
newmtl Cube_1_1_1
|
||||
illum 1
|
||||
Ka 0.0 0.0 0.0
|
||||
Kd 0.0 0.0 0.0
|
||||
Ks 0.0 0.0 0.0
|
||||
Ns 1.0
|
||||
|
||||
newmtl Cylinder_7_7
|
||||
illum 1
|
||||
Ka 0.4 0.4 0.4
|
||||
Kd 0.4 0.4 0.4
|
||||
Ks 0.0 0.0 0.0
|
||||
Ns 1.0
|
||||
|
||||
newmtl Cylinder_10_10
|
||||
illum 1
|
||||
Ka 0.8 0.4 0.0
|
||||
Kd 0.8 0.4 0.0
|
||||
Ks 0.0 0.0 0.0
|
||||
Ns 1.0
|
||||
|
||||
newmtl Cylinder_11_11
|
||||
illum 2
|
||||
Ka 0.2 0.2 0.2
|
||||
Kd 0.2 0.2 0.2
|
||||
Ks 0.0 0.0 0.0
|
||||
Ns 1.0
|
||||
|
||||
newmtl 12_12
|
||||
illum 1
|
||||
Ka 0.2 0.2 0.2
|
||||
Kd 0.2 0.2 0.2
|
||||
Ks 0.0 0.0 0.0
|
||||
Ns 1.0
|
||||
|
||||
newmtl Cube_1_1_1_Cube_1_1_1_38
|
||||
illum 1
|
||||
Ka 0.6 0.6 0.6
|
||||
Kd 0.6 0.6 0.6
|
||||
Ks 0.0 0.0 0.0
|
||||
Ns 1.0
|
||||
|
||||
newmtl white_Cylinder_58
|
||||
illum 1
|
||||
Ka 0.1882353 0.27058825 0.58431375
|
||||
Kd 0.1882353 0.27058825 0.58431375
|
||||
Ks 0.0 0.0 0.0
|
||||
Ns 0.0
|
||||
|
||||
newmtl white_Cylinder_59
|
||||
illum 1
|
||||
Ka 0.3137255 0.14901961 0.011764706
|
||||
Kd 0.3137255 0.14901961 0.011764706
|
||||
Ks 0.0 0.0 0.0
|
||||
Ns 0.0
|
||||
|
||||
newmtl 1_1
|
||||
illum 2
|
||||
Ka 0.2 0.2 0.2
|
||||
Kd 1.0 1.0 1.0
|
||||
Ks 0.5 0.5 0.5
|
||||
Ns 64.0
|
||||
Ni 1.0
|
||||
d 0.48000002
|
||||
map_Kd Missile_AIM-120_D_[AMRAAM]_1_1.png
|
||||
|
||||
newmtl Cube_1_2_2
|
||||
illum 1
|
||||
Ka 0.8 0.4 0.0
|
||||
Kd 0.8 0.4 0.0
|
||||
Ks 0.0 0.0 0.0
|
||||
Ns 1.0
|
||||
|
||||
newmtl Cylinder_4_4
|
||||
illum 2
|
||||
Ka 0.6 0.6 0.6
|
||||
Kd 0.6 0.6 0.6
|
||||
Ks 0.5 0.5 0.5
|
||||
Ns 64.0
|
||||
|
||||
newmtl Cylinder_5_5
|
||||
illum 2
|
||||
Ka 0.8 0.8 0.0
|
||||
Kd 0.8 0.8 0.0
|
||||
Ks 0.5 0.5 0.5
|
||||
Ns 64.0
|
||||
|
||||
newmtl Cylinder_6_6
|
||||
illum 2
|
||||
Ka 0.8784314 0.8745098 0.8901961
|
||||
Kd 0.8784314 0.8745098 0.8901961
|
||||
Ks 0.5 0.5 0.5
|
||||
Ns 64.0
|
||||
|
||||
newmtl Cylinder_10_10_Cylinder_10_10_73
|
||||
illum 1
|
||||
Ka 0.2 0.2 0.2
|
||||
Kd 0.2 0.2 0.2
|
||||
Ks 0.0 0.0 0.0
|
||||
Ns 1.0
|
||||
|
||||
newmtl 11_11
|
||||
illum 1
|
||||
Ka 0.6 0.6 0.6
|
||||
Kd 0.6 0.6 0.6
|
||||
Ks 0.0 0.0 0.0
|
||||
Ns 1.0
|
||||
|
||||
newmtl Cube_1_1_1_Cube_1_1_1_76
|
||||
illum 1
|
||||
Ka 0.2 0.2 0.2
|
||||
Kd 1.0 1.0 1.0
|
||||
Ks 0.0 0.0 0.0
|
||||
Ns 1.0
|
||||
Ni 1.0
|
||||
map_Kd Missile_AIM-120_D_[AMRAAM]_Cube_1_1_1_Cube_1_1_1_76.png
|
||||
|
||||
newmtl Cylinder_2_2
|
||||
illum 2
|
||||
Ka 0.6 0.6 0.6
|
||||
Kd 0.6 0.6 0.6
|
||||
Ks 0.5 0.5 0.5
|
||||
Ns 64.0
|
||||
|
||||
newmtl Cylinder_3_3
|
||||
illum 1
|
||||
Ka 0.4 0.4 0.0
|
||||
Kd 0.4 0.4 0.0
|
||||
Ks 0.0 0.0 0.0
|
||||
Ns 1.0
|
||||
|
||||
newmtl Cylinder_4_4_Cylinder_4_4_79
|
||||
illum 1
|
||||
Ka 0.0 0.0 0.0
|
||||
Kd 0.0 0.0 0.0
|
||||
Ks 0.0 0.0 0.0
|
||||
Ns 1.0
|
||||
|
||||
newmtl Cube_1_5_5
|
||||
illum 1
|
||||
Ka 0.2 0.2 0.2
|
||||
Kd 1.0 1.0 1.0
|
||||
Ks 0.0 0.0 0.0
|
||||
Ns 1.0
|
||||
map_Kd Missile_AIM-120_D_[AMRAAM]_Cube_1_5_5.png
|
||||
|
||||
newmtl Cube_1_6_6
|
||||
illum 1
|
||||
Ka 0.2 0.2 0.2
|
||||
Kd 1.0 1.0 1.0
|
||||
Ks 0.0 0.0 0.0
|
||||
Ns 1.0
|
||||
Ni 1.0
|
||||
map_Kd Missile_AIM-120_D_[AMRAAM]_Cube_1_6_6.png
|
||||
|
||||
newmtl Cylinder_1_1
|
||||
illum 1
|
||||
Ka 0.4 0.4 0.4
|
||||
Kd 0.4 0.4 0.4
|
||||
Ks 0.0 0.0 0.0
|
||||
Ns 1.0
|
||||
|
||||
newmtl Cube_1_5_5_Cube_1_5_5_86
|
||||
illum 1
|
||||
Ka 0.2 0.2 0.2
|
||||
Kd 0.2 0.2 0.2
|
||||
Ks 0.0 0.0 0.0
|
||||
Ns 1.0
|
||||
|
||||
newmtl Cube_1_6_6_Cube_1_6_6_87
|
||||
illum 1
|
||||
Ka 0.8 0.0 0.0
|
||||
Kd 0.8 0.0 0.0
|
||||
Ks 0.0 0.0 0.0
|
||||
Ns 1.0
|
||||
|
||||
newmtl Cylinder_7_7_Cylinder_7_7_88
|
||||
illum 1
|
||||
Ka 0.8 0.4 0.0
|
||||
Kd 0.8 0.4 0.0
|
||||
Ks 0.0 0.0 0.0
|
||||
Ns 1.0
|
||||
|
||||
newmtl Cylinder_8_8
|
||||
illum 1
|
||||
Ka 0.4 0.6 0.0
|
||||
Kd 0.4 0.6 0.0
|
||||
Ks 0.0 0.0 0.0
|
||||
Ns 1.0
|
||||
Binary file not shown.
|
After Width: | Height: | Size: 210 KiB |
Binary file not shown.
|
After Width: | Height: | Size: 164 KiB |
Binary file not shown.
|
After Width: | Height: | Size: 289 KiB |
Binary file not shown.
|
After Width: | Height: | Size: 26 KiB |
@@ -0,0 +1,3 @@
|
||||
based on:
|
||||
https://free3d.com/de/3d-model/aim-120d-missile-51025.html
|
||||
License: Free Personal Use Only
|
||||
Binary file not shown.
Binary file not shown.
Reference in New Issue
Block a user