DarkBasic Pro Vol 2
DarkBasic Pro Vol 2
DarkBasic Pro Vol 2
Volume 2
A Self-Study Guide to Games Programming
Alistair Stewart
Volume 2
Alistair Stewart
Digital Skills
Milton Barr Girvan Ayrshire KA26 9TY www.digital-skills.co.uk
All rights reserved. No part of this work may be reproduced or used in any form without the written permission of the author.
Although every effort has been made to ensure accuracy, the author and publisher accept neither liability nor responsibility for any loss or damage arising from the information in this book. All brand names and product names are trademarks of their respective companies and have been capitalised throughout the text. DarkBASIC Professional is produced by The Game Creators Ltd
Title
ISBN-10 ISBN-13
Other Titles Available: Hands On DarkBASIC Pro Volume 1 Hands On Pascal Hands On C++ Hands On Java Hands On XHTML
TABLE OF CONTENTS
Chapter 30 3D Concepts and Terminology
The 3D World ...............................................................................................744 Introduction . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 744 The Coordinate System . . . . . . . . . . . . . . . . . . . . . . . 744 Axes . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 744 Planes . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 745 Points . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 746 World Units . . . . . . . . . . . . . . . . . . . . . . . . . . . . 747 Local Axes . . . . . . . . . . . . . . . . . . . . . . . . . . . . 747 Rotation . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 748 3D Vectors . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 748 Object Terminology . . . . . . . . . . . . . . . . . . . . . . . . . . 749 Textures . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 750 Images with an Alpha Channel . . . . . . . . . . . . . . . . . 750 Cameras . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 751 Lights . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 752 Summary . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 753
Chapter 31
3D Primitives
3D Primitives ................................................................................................756 Introduction . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 756 Creating a Cube . . . . . . . . . . . . . . . . . . . . . . . . . . . 756 The MAKE OBJECT CUBE Statement . . . . . . . . . . . . . 756 Creating Other Primitives . . . . . . . . . . . . . . . . . . . . . . . 757 The MAKE OBJECT BOX Statement . . . . . . . . . . . . . . 757 The MAKE OBJECT SPHERE Statement . . . . . . . . . . . . 758 The MAKE OBJECT CYLINDER Statement . . . . . . . . . . . 759 The MAKE OBJECT CONE Statement . . . . . . . . . . . . . 760 The MAKE OBJECT PLAIN Statement . . . . . . . . . . . . . 760 The MAKE OBJECT TRIANGLE Statement . . . . . . . . . . . 761 Positioning an Object . . . . . . . . . . . . . . . . . . . . . . . . . 762 The POSITION OBJECT Statement . . . . . . . . . . . . . . . 762 The MOVE OBJECT Statement . . . . . . . . . . . . . . . . . 764 Rotating Objects - Absolute Rotation . . . . . . . . . . . . . . . . . 765 The XROTATE OBJECT Statement . . . . . . . . . . . . . . . 766 The YROTATE OBJECT Statement . . . . . . . . . . . . . . . 767 The ZROTATE OBJECT Statement . . . . . . . . . . . . . . . 767 The ROTATE OBJECT Statement . . . . . . . . . . . . . . . . 768 The SET OBJECT ROTATION Statement . . . . . . . . . . . 769 Rotating Objects - Relative Rotation . . . . . . . . . . . . . . . . . 769 The PITCH OBJECT Statement . . . . . . . . . . . . . . . . . 770
The TURN OBJECT Statement . . . . . . . . . . . . . . . . . 770 The ROLL OBJECT Statement . . . . . . . . . . . . . . . . . 771 The POINT OBJECT Statement . . . . . . . . . . . . . . . . . 771 The MOVE OBJECT distance Statement . . . . . . . . . . . . 772 The FIX OBJECT PIVOT Statement . . . . . . . . . . . . . . . 773 Resizing Objects . . . . . . . . . . . . . . . . . . . . . . . . . . . 775 The SCALE OBJECT Statement . . . . . . . . . . . . . . . . . 775 Showing and Hiding Objects . . . . . . . . . . . . . . . . . . . . . 776 The HIDE OBJECT Statement . . . . . . . . . . . . . . . . . . 776 The SHOW OBJECT Statement . . . . . . . . . . . . . . . . . 776 The DELETE OBJECT Statement . . . . . . . . . . . . . . . . 777 The DELETE OBJECTS Statement . . . . . . . . . . . . . . . 777 Copying a 3D Object . . . . . . . . . . . . . . . . . . . . . . . . . 778 The CLONE OBJECT Statement . . . . . . . . . . . . . . . . 778 The INSTANCE OBJECT Statement . . . . . . . . . . . . . . 779 Retrieving Data on 3D Objects . . . . . . . . . . . . . . . . . . . . 779 The OBJECT EXIST Statement . . . . . . . . . . . . . . . . . 779 The OBJECT POSITION Statement . . . . . . . . . . . . . . 780 The OBJECT VISIBLE Statement . . . . . . . . . . . . . . . . 780 The OBJECT SIZE Statement . . . . . . . . . . . . . . . . . . 781 The OBJECT ANGLE Statement . . . . . . . . . . . . . . . . 781 Controlling an Object's Rotation Using the Mouse . . . . . . . . . . 782 Wireframe and Culling . . . . . . . . . . . . . . . . . . . . . . . . 783 The SET OBJECT WIREFRAME Statement . . . . . . . . . . 783 The SET OBJECT CULL Statement . . . . . . . . . . . . . . . 784 Storage Methods . . . . . . . . . . . . . . . . . . . . . . . . . . . 785 The SET GLOBAL OBJECT CREATION Statement . . . . . . 785 Summary . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 786 Merging Primitives........................................................................................788 Introduction . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 788 The Statements . . . . . . . . . . . . . . . . . . . . . . . . . . . 788 The PERFORM CSG UNION Statement . . . . . . . . . . . . 788 The PERFORM CSG DIFFERENCE Statement . . . . . . . . . 790 The PERFORM CSG INTERSECTION Statement . . . . . . . 790 Summary . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 791 Solutions.......................................................................................................792
Chapter 32
Texturing
Adding Texture .............................................................................................798 Introduction . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 798 Loading a Texture Image . . . . . . . . . . . . . . . . . . . . . . . 798 Using the Image as a Texture . . . . . . . . . . . . . . . . . . . . 798 The TEXTURE OBJECT Statement . . . . . . . . . . . . . . . 798 Mipmaps . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 799 The LOAD IMAGE Statement Again . . . . . . . . . . . . . . . 800
Tiling . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 801 The SCALE OBJECT TEXTURE Statement . . . . . . . . . . . 802 Seamless Tiling . . . . . . . . . . . . . . . . . . . . . . . . . . . 804 Video Texture . . . . . . . . . . . . . . . . . . . . . . . . . . . . 805 The PLAY ANIMATION TO IMAGE Statement . . . . . . . . . 805 Other Texture Effects . . . . . . . . . . . . . . . . . . . . . . . . . 807 The SET OBJECT TEXTURE Statement . . . . . . . . . . . . 807 The SCROLL OBJECT TEXTURE Statement . . . . . . . . . . 808 The SET OBJECT TRANSPARENCY Statement . . . . . . . . 810 The SET DETAIL MAPPING ON Statement . . . . . . . . . . . 811 The SET OBJECT FILTER Statement . . . . . . . . . . . . . . 813 Summary . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 814 Other Visual Effects .....................................................................................815 Introduction . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 815 Changing Colour and Transparency . . . . . . . . . . . . . . . . . 815 The COLOR OBJECT Statement . . . . . . . . . . . . . . . . 815 The GHOST OBJECT ON Statement . . . . . . . . . . . . . . 816 The GHOST OBJECT OFF Statement . . . . . . . . . . . . . 817 The FADE OBJECT Statement . . . . . . . . . . . . . . . . . 817 Summary . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 819 Images with an Alpha Channel ....................................................................820 Introduction . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 820 Using Images with an Alpha Channel . . . . . . . . . . . . . . . . 820 Summary . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 821 Creating a Complex 3D Shape ....................................................................822 Introduction . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 822 Designing the Castle . . . . . . . . . . . . . . . . . . . . . . . . . 822 Gathering the Components . . . . . . . . . . . . . . . . . . . 823 Creating the Code . . . . . . . . . . . . . . . . . . . . . . . . . . 823 The Code . . . . . . . . . . . . . . . . . . . . . . . . . . . . 824 Sky Spheres . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 828 Summary . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 830 Solutions.......................................................................................................831
Chapter 33
Cameras
Camera Basics .............................................................................................836 Introduction . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 836 Positioning the Camera . . . . . . . . . . . . . . . . . . . . . . . 836 The POSITION CAMERA Statement . . . . . . . . . . . . . . 836 The MOVE CAMERA Statement . . . . . . . . . . . . . . . . . 837 Changing the Viewpoint . . . . . . . . . . . . . . . . . . . . . . . 838 The POINT CAMERA Statement . . . . . . . . . . . . . . . . 838 The ROTATE CAMERA Statement . . . . . . . . . . . . . . . 838 The SET CAMERA ROTATION Statement . . . . . . . . . . . 840 The XROTATE CAMERA Statement . . . . . . . . . . . . . . 840
The YROTATE CAMERA Statement . . . . . . . . . . . . . . 841 The ZROTATE CAMERA Statement . . . . . . . . . . . . . . 841 The PITCH CAMERA Statement . . . . . . . . . . . . . . . . 842 The TURN CAMERA Statement . . . . . . . . . . . . . . . . . 842 The ROLL CAMERA Statement . . . . . . . . . . . . . . . . . 843 Retrieving Camera Data . . . . . . . . . . . . . . . . . . . . . . . 844 The CAMERA POSITION Statement . . . . . . . . . . . . . . 844 The CAMERA ANGLE Statement . . . . . . . . . . . . . . . . 844 Modifying Camera Characteristics . . . . . . . . . . . . . . . . . . 845 The SET CAMERA VIEW Statement . . . . . . . . . . . . . . 845 The SET CAMERA ASPECT Statement . . . . . . . . . . . . . 846 The SET CAMERA FOV Statement . . . . . . . . . . . . . . . 847 The SET CAMERA RANGE Statement . . . . . . . . . . . . . 848 Summary . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 849 Controlling Camera Movement.....................................................................851 Introduction . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 851 Automatic Camera Placement . . . . . . . . . . . . . . . . . . . . 851 The AUTOCAM Statement . . . . . . . . . . . . . . . . . . . . 851 Following the Action . . . . . . . . . . . . . . . . . . . . . . . . . 852 The SET CAMERA TO FOLLOW Statement . . . . . . . . . . 853 Giving the Player Control of the Camera . . . . . . . . . . . . . . . 856 The CONTROL CAMERA USING ARROWKEYS Statement . . 856 The AUTOMATIC CAMERA COLLISION Statement . . . . . . 858 Controlling the Camera with the Mouse . . . . . . . . . . . . . 859 Summary . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 862 Multiple Cameras .........................................................................................863 Introduction . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 863 Using Additional Cameras . . . . . . . . . . . . . . . . . . . . . . 863 The MAKE CAMERA Statement . . . . . . . . . . . . . . . . . 863 The COLOR BACKDROP Statement . . . . . . . . . . . . . . 864 The BACKDROP Statement . . . . . . . . . . . . . . . . . . . 864 The SET CURRENT CAMERA Statement . . . . . . . . . . . . 865 The DELETE CAMERA Statement . . . . . . . . . . . . . . . 866 Switching Between Cameras . . . . . . . . . . . . . . . . . . 866 Multiple Camera Output . . . . . . . . . . . . . . . . . . . . . 868 The CLEAR CAMERA VIEW Statement . . . . . . . . . . . . . 869 Summary . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 870 Advanced Camera Techniques ....................................................................871 Introduction . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 871 The Statements . . . . . . . . . . . . . . . . . . . . . . . . . . . 871 The SET CAMERA TO IMAGE Statement . . . . . . . . . . . . 871 The SET CAMERA TO OBJECT ORIENTATION Statement . . 873 The SET OBJECT TO CAMERA ORIENTATION Statement . . 873 The LOCK OBJECT Statement . . . . . . . . . . . . . . . . . 874 The SET VECTOR3 TO CAMERA POSITION Statement . . . . 875 The SET VECTOR3 TO CAMERA ROTATION Statement . . . 876
Chapter 34
Lighting
Lighting.........................................................................................................886 Introduction . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 886 Types of Lighting . . . . . . . . . . . . . . . . . . . . . . . . . . . 886 Ambient Lighting . . . . . . . . . . . . . . . . . . . . . . . . . 886 Point Lighting . . . . . . . . . . . . . . . . . . . . . . . . . . 886 Spot Lighting . . . . . . . . . . . . . . . . . . . . . . . . . . . 886 Directional Lighting . . . . . . . . . . . . . . . . . . . . . . . . 886 Lighting in DarkBASIC Pro . . . . . . . . . . . . . . . . . . . . . . 887 The HIDE LIGHT Statement . . . . . . . . . . . . . . . . . . . 887 The SHOW LIGHT Statement . . . . . . . . . . . . . . . . . . 888 The SET AMBIENT LIGHT Statement . . . . . . . . . . . . . . 888 The COLOR AMBIENT LIGHT Statement . . . . . . . . . . . . 889 The MAKE LIGHT Statement . . . . . . . . . . . . . . . . . . 889 The DELETE LIGHT Statement . . . . . . . . . . . . . . . . . 890 The COLOR LIGHT Statement . . . . . . . . . . . . . . . . . 890 The POSITION LIGHT Statement . . . . . . . . . . . . . . . . 891 The SET LIGHT RANGE Statement . . . . . . . . . . . . . . . 891 The SET SPOT LIGHT Statement . . . . . . . . . . . . . . . . 892 The SET DIRECTIONAL LIGHT Statement . . . . . . . . . . . 892 The SET POINT LIGHT Statement . . . . . . . . . . . . . . . 893 The POINT LIGHT Statement . . . . . . . . . . . . . . . . . . 893 The ROTATE LIGHT Statement . . . . . . . . . . . . . . . . . 895 The SET LIGHT TO OBJECT POSITION Statement . . . . . . 895 The SET LIGHT TO OBJECT ORIENTATION Statement . . . . 897 Retrieving Light Data . . . . . . . . . . . . . . . . . . . . . . . . . 898 The LIGHT EXIST Statement . . . . . . . . . . . . . . . . . . 898 The LIGHT VISIBLE Statement . . . . . . . . . . . . . . . . . 899 The LIGHT RANGE Statement . . . . . . . . . . . . . . . . . 899 The LIGHT TYPE Statement . . . . . . . . . . . . . . . . . . . 899 The LIGHT POSITION Statement . . . . . . . . . . . . . . . . 900 The LIGHT DIRECTION Statement . . . . . . . . . . . . . . . 900 Fog . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 901 The FOG Statement . . . . . . . . . . . . . . . . . . . . . . . 901 The FOG COLOR Statement . . . . . . . . . . . . . . . . . . 902 The FOG DISTANCE Statement . . . . . . . . . . . . . . . . . 902 The SET OBJECT FOG Statement . . . . . . . . . . . . . . . 903 Summary . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 904 Solutions.......................................................................................................907
Chapter 35
Meshes.........................................................................................................912 Introduction . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 912 Handling Meshes . . . . . . . . . . . . . . . . . . . . . . . . . . . 912 The MAKE MESH FROM OBJECT Statement . . . . . . . . . 912 The SAVE MESH Statement . . . . . . . . . . . . . . . . . . . 913 The LOAD MESH Statement . . . . . . . . . . . . . . . . . . 914 The MAKE OBJECT Statement . . . . . . . . . . . . . . . . . 914 The DELETE MESH Statement . . . . . . . . . . . . . . . . . 915 The MESH EXIST Statement . . . . . . . . . . . . . . . . . . 915 Summary . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 916 Limbs............................................................................................................917 Introduction . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 917 Getting Started . . . . . . . . . . . . . . . . . . . . . . . . . . . . 917 The ADD LIMB Statement . . . . . . . . . . . . . . . . . . . . 917 The MAKE OBJECT FROM LIMB Statement . . . . . . . . . . 919 The OFFSET LIMB Statement . . . . . . . . . . . . . . . . . . 920 The ROTATE LIMB Statement . . . . . . . . . . . . . . . . . . 920 The SCALE LIMB Statement . . . . . . . . . . . . . . . . . . 922 The COLOR LIMB Statement . . . . . . . . . . . . . . . . . . 922 The TEXTURE LIMB Statement . . . . . . . . . . . . . . . . . 923 The SCALE LIMB TEXTURE Statement . . . . . . . . . . . . . 925 The SCROLL LIMB TEXTURE Statement . . . . . . . . . . . . 927 The HIDE LIMB Statement . . . . . . . . . . . . . . . . . . . . 927 The SHOW LIMB Statement . . . . . . . . . . . . . . . . . . . 928 The REMOVE LIMB Statement . . . . . . . . . . . . . . . . . 928 The LINK LIMB Statement . . . . . . . . . . . . . . . . . . . . 928 The CHANGE MESH Statement . . . . . . . . . . . . . . . . . 931 The GLUE OBJECT TO LIMB Statement . . . . . . . . . . . . 931 The UNGLUE OBJECT Statement . . . . . . . . . . . . . . . 934 The SET LIMB SMOOTHING Statement . . . . . . . . . . . . 934 Creating Doors . . . . . . . . . . . . . . . . . . . . . . . . . . . . 935 Retrieving Limb Data . . . . . . . . . . . . . . . . . . . . . . . . . 936 The LIMB EXIST Statement . . . . . . . . . . . . . . . . . . . 936 The LIMB VISIBLE Statement . . . . . . . . . . . . . . . . . . 937 The LIMB OFFSET Statement . . . . . . . . . . . . . . . . . . 937 The LIMB SCALE Statement . . . . . . . . . . . . . . . . . . 938 The LIMB ANGLE Statement . . . . . . . . . . . . . . . . . . 939 The LIMB POSITION Statement . . . . . . . . . . . . . . . . . 939 The LIMB DIRECTION Statement . . . . . . . . . . . . . . . . 940 The PERFORM CHECKLIST FOR OBJECT LIMBS Statement . 944 The LIMB NAME$ Statement . . . . . . . . . . . . . . . . . . 945 The LIMB TEXTURE Statement . . . . . . . . . . . . . . . . . 946 The LIMB TEXTURE NAME Statement . . . . . . . . . . . . . 946 The CHECK LIMB LINK Statement . . . . . . . . . . . . . . . 947
Saving a Model in DBO Format . . . . . . . . . . . . . . . . . . . 947 Introduction . . . . . . . . . . . . . . . . . . . . . . . . . . . 947 The DBO File Format . . . . . . . . . . . . . . . . . . . . . . 948 Creating an Elevator Model . . . . . . . . . . . . . . . . . . . 948 The SAVE OBJECT Statement . . . . . . . . . . . . . . . . . 949 The LOAD OBJECT Statement . . . . . . . . . . . . . . . . . 950 Summary . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 951 Solutions.......................................................................................................953
Chapter 36
Importing 3D Objects
Importing 3D Objects....................................................................................962 Introduction . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 962 File Formats . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 963 Statements for Loading and Using 3D Objects . . . . . . . . . . . . 963 The LOAD OBJECT Statement Again . . . . . . . . . . . . . . 963 The PLAY OBJECT Statement . . . . . . . . . . . . . . . . . 965 The LOOP OBJECT Statement . . . . . . . . . . . . . . . . . 966 The TOTAL OBJECT FRAMES Statement . . . . . . . . . . . 966 Moving the Alien . . . . . . . . . . . . . . . . . . . . . . . . . 967 The SET OBJECT SPEED Statement . . . . . . . . . . . . . . 967 The STOP OBJECT Statement . . . . . . . . . . . . . . . . . 968 The SET OBJECT FRAME Statement . . . . . . . . . . . . . . 968 The SET OBJECT INTERPOLATION Statement . . . . . . . . 969 The APPEND OBJECT Statement . . . . . . . . . . . . . . . . 970 Retrieving Animation Object Information . . . . . . . . . . . . . . . 971 The OBJECT PLAYING Statement . . . . . . . . . . . . . . . 971 The OBJECT LOOPING Statement . . . . . . . . . . . . . . . 971 The OBJECT FRAME Statement . . . . . . . . . . . . . . . . 972 The OBJECT SPEED Statement . . . . . . . . . . . . . . . . 972 The OBJECT INTERPOLATION Statement . . . . . . . . . . . 972 The OBJECT SIZE Statement . . . . . . . . . . . . . . . . . . 973 Limbs . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 974 Summary . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 975 Solutions.......................................................................................................977
Chapter 37
Screen Control
User Control .................................................................................................980 Introduction . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 980 Selecting an Object . . . . . . . . . . . . . . . . . . . . . . . . . . 980 The OBJECT SCREEN Statement . . . . . . . . . . . . . . . 982 The PICK OBJECT Statement . . . . . . . . . . . . . . . . . . 983 The GET PICK DISTANCE Statement . . . . . . . . . . . . . . 984 The PICK VECTOR Statement . . . . . . . . . . . . . . . . . 985 The PICK SCREEN Statement . . . . . . . . . . . . . . . . . 986
The OBJECT IN SCREEN Statement . . . . . . . . . . . . . . 987 Selecting Objects using the Mouse . . . . . . . . . . . . . . . . . 988 Summary . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 990 Solutions.......................................................................................................991
Chapter 38
Solitaire
Solitaire - The Board Game..........................................................................994 Introduction . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 994 The Equipment . . . . . . . . . . . . . . . . . . . . . . . . . . 994 The Aim . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 994 The Rules . . . . . . . . . . . . . . . . . . . . . . . . . . . . 994 Creating a Computer Version of the Game . . . . . . . . . . . . . 994 User Controls . . . . . . . . . . . . . . . . . . . . . . . . . . 994 Game Responses . . . . . . . . . . . . . . . . . . . . . . . . 995 Screen Layout . . . . . . . . . . . . . . . . . . . . . . . . . . 995 Media Used . . . . . . . . . . . . . . . . . . . . . . . . . . . 995 Data Structures . . . . . . . . . . . . . . . . . . . . . . . . . 996 Adding SetUpScreen() . . . . . . . . . . . . . . . . . . . . . . 999 Adding SetUpGame() . . . . . . . . . . . . . . . . . . . . . . 1000 Adding CreateBoard() . . . . . . . . . . . . . . . . . . . . . . 1001 Adding CreateInternalBoard() . . . . . . . . . . . . . . . . . . 1001 Adding CreateMarbles() . . . . . . . . . . . . . . . . . . . . . 1002 Adding CreateSelector() . . . . . . . . . . . . . . . . . . . . . 1002 Adding SetUpHelp() . . . . . . . . . . . . . . . . . . . . . . . 1003 Adding GetPlayerMove() . . . . . . . . . . . . . . . . . . . . . 1004 Adding MoveSelector() . . . . . . . . . . . . . . . . . . . . . . 1006 Adding SelectMarble() . . . . . . . . . . . . . . . . . . . . . . 1007 Adding SelectPit() . . . . . . . . . . . . . . . . . . . . . . . . 1008 Adding IsValidMove() . . . . . . . . . . . . . . . . . . . . . . 1008 Adding MoveMarble() . . . . . . . . . . . . . . . . . . . . . . 1008 Adding SelectHelpPage() . . . . . . . . . . . . . . . . . . . . 1009 Using the Mouse . . . . . . . . . . . . . . . . . . . . . . . . . . . 1009 Introduction . . . . . . . . . . . . . . . . . . . . . . . . . . . 1009 Updating the Program . . . . . . . . . . . . . . . . . . . . . . 1010 Suggested Enhancements . . . . . . . . . . . . . . . . . . . . . . 1013 Solutions.....................................................................................................1015
Chapter 39
Advanced Lighting and Texturing...............................................................1028 Introduction . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 1028 Surface Reflection . . . . . . . . . . . . . . . . . . . . . . . . . . 1028 The SET OBJECT AMBIENT Statement . . . . . . . . . . . . 1029 The SET OBJECT DIFFUSE Statement . . . . . . . . . . . . . 1030 The SET OBJECT SPECULAR Statement . . . . . . . . . . . 1030
The SET OBJECT SPECULAR POWER Statement . . . . . . 1031 The SET OBJECT EMISSIVE Statement . . . . . . . . . . . . 1031 The SET OBJECT LIGHT Statement . . . . . . . . . . . . . . 1034 Mappings . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 1035 The SET LIGHT MAPPING ON Statement . . . . . . . . . . . 1035 The SET BUMP MAPPING ON Statement . . . . . . . . . . . 1038 The SET SPHERE MAPPING ON Statement . . . . . . . . . . 1039 The SET BLEND MAPPING ON Statement . . . . . . . . . . . 1041 The SET CUBE MAPPING ON Statement . . . . . . . . . . . . 1042 The SET ALPHA MAPPING ON Statement . . . . . . . . . . . 1044 Shadows . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 1045 The SET SHADOW SHADING ON Statement . . . . . . . . . . 1045 The SET SHADOW SHADING OFF Statement . . . . . . . . . 1048 The SET GLOBAL SHADOWS Statement . . . . . . . . . . . . 1048 The SET GLOBAL SHADOW COLOR Statement . . . . . . . . 1050 The SET GLOBAL SHADOW SHADES Statement . . . . . . . 1050 Positioning Shadows . . . . . . . . . . . . . . . . . . . . . . . . . 1051 The SET SHADOW POSITION Statement . . . . . . . . . . . 1051 Shadows and Models . . . . . . . . . . . . . . . . . . . . . . . . 1052 Other Shading Methods . . . . . . . . . . . . . . . . . . . . . . . 1054 The SET CARTOON SHADING ON Statement . . . . . . . . . 1054 The SET RAINBOW SHADING ON Statement . . . . . . . . . 1056 The SET REFLECTION SHADING ON Statement . . . . . . . 1057 The SET SHADING OFF Statement . . . . . . . . . . . . . . . 1058 Summary . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 1058 Solutions.....................................................................................................1061
Chapter 40
Collisions
Object Collisions ........................................................................................1068 Introduction . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 1068 Object Collision . . . . . . . . . . . . . . . . . . . . . . . . . . . . 1068 The OBJECT HIT Statement . . . . . . . . . . . . . . . . . . . 1069 The OBJECT COLLISION Statement . . . . . . . . . . . . . . 1070 The SET OBJECT COLLISION Statement . . . . . . . . . . . 1070 The SET GLOBAL COLLISION Statement . . . . . . . . . . . 1071 How Collision Detection Works . . . . . . . . . . . . . . . . . . . . 1071 The SHOW OBJECT BOUNDS Statement . . . . . . . . . . . 1072 The HIDE OBJECT BOUNDS statement . . . . . . . . . . . . 1072 Modifying Collision Detection . . . . . . . . . . . . . . . . . . . . . 1074 The SET OBJECT COLLISION TO SPHERES Statement . . . 1074 The SET OBJECT RADIUS Statement . . . . . . . . . . . . . 1074 The OBJECT COLLISION RADIUS Statement . . . . . . . . . 1075 The OBJECT COLLISION CENTER Statement . . . . . . . . . 1075 The SET OBJECT COLLISION TO BOXES Statement . . . . . 1076 The SET OBJECT COLLISION TO POLYGONS Statement . . 1076
The MAKE OBJECT COLLISION BOX Statement . . . . . . . 1077 The GET OBJECT COLLISION Statement . . . . . . . . . . . 1080 The DELETE OBJECT COLLISION BOX Statement . . . . . . 1082 The AUTOMATIC OBJECT COLLISION Statement . . . . . . . 1082 The INTERSECT OBJECT Statement . . . . . . . . . . . . . . 1083 Summary . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 1085 Static Collisions ..........................................................................................1087 Introduction . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 1087 Creating and Using Static Collision Boxes . . . . . . . . . . . . . . 1087 The MAKE STATIC COLLISION BOX Statement . . . . . . . . 1087 The GET STATIC COLLISION HIT Statement . . . . . . . . . 1087 The GET STATIC COLLISION Statement . . . . . . . . . . . 1089 The STATIC LINE OF SIGHT Statement . . . . . . . . . . . . 1093 The STATIC LINE OF SIGHT Coordinates Statement . . . . . 1095 Static Collision Boxes and the Camera . . . . . . . . . . . . . . . 1096 Summary . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 1096 Solutions.....................................................................................................1098
Chapter 41
Particles
Particles......................................................................................................1102 Introduction . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 1102 Creating Particles . . . . . . . . . . . . . . . . . . . . . . . . . . 1102 The MAKE PARTICLES Statement . . . . . . . . . . . . . . . 1102 The HIDE PARTICLES Statement . . . . . . . . . . . . . . . . 1103 The SHOW PARTICLES Statement . . . . . . . . . . . . . . . 1104 The DELETE PARTICLES Statement . . . . . . . . . . . . . . 1104 The POSITION PARTICLES Statement . . . . . . . . . . . . . 1104 The POSITION PARTICLE EMISSIONS Statement . . . . . . . 1105 The ROTATE PARTICLES Statement . . . . . . . . . . . . . . 1106 The COLOR PARTICLES Statement . . . . . . . . . . . . . . 1107 The SET PARTICLE EMISSIONS Statement . . . . . . . . . . 1108 The SET PARTICLE VELOCITY Statement . . . . . . . . . . . 1109 The SET PARTICLE GRAVITY Statement . . . . . . . . . . . 1110 The SET PARTICLE CHAOS Statement . . . . . . . . . . . . 1110 The SET PARTICLE SPEED Statement . . . . . . . . . . . . . 1111 The SET PARTICLE FLOOR Statement . . . . . . . . . . . . . 1112 The SET PARTICLE LIFE Statement . . . . . . . . . . . . . . 1113 The GHOST PARTICLES ON Statement . . . . . . . . . . . . 1113 The GHOST PARTICLES OFF Statement . . . . . . . . . . . . 1114 Retrieving Data on a Particles Object . . . . . . . . . . . . . . . . 1114 The PARTICLES EXIST Statement . . . . . . . . . . . . . . . 1114 The PARTICLES POSITION Statement . . . . . . . . . . . . 1115 Particles Statements that use Vectors . . . . . . . . . . . . . . . . 1116 The SET VECTOR3 TO PARTICLES POSITION Statement . . 1116 The SET VECTOR3 TO PARTICLES ROTATION Statement . . 1116
Summary . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 1116 Other Types of Particles.............................................................................1118 Introduction . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 1118 The Statements . . . . . . . . . . . . . . . . . . . . . . . . . . . 1118 The MAKE SNOW PARTICLES Statement . . . . . . . . . . . 1118 The MAKE FIRE PARTICLES Statement . . . . . . . . . . . . 1119 Summary . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 1120 Examples of Using Particles ......................................................................1121 Introduction . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 1121 A Roman Candle . . . . . . . . . . . . . . . . . . . . . . . . . . . 1121 A Spaceship . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 1122 A Dungeon Torch . . . . . . . . . . . . . . . . . . . . . . . . . . . 1122 Solutions.....................................................................................................1124
Chapter 42
Elevators ....................................................................................................1128 Introduction . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 1128 The Equipment . . . . . . . . . . . . . . . . . . . . . . . . . . 1128 The Aim . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 1128 The Rules . . . . . . . . . . . . . . . . . . . . . . . . . . . . 1128 Creating a Computer version of the Game . . . . . . . . . . . . . . 1128 User Controls . . . . . . . . . . . . . . . . . . . . . . . . . . 1128 Game Responses . . . . . . . . . . . . . . . . . . . . . . . . 1128 Screen Layout . . . . . . . . . . . . . . . . . . . . . . . . . . 1128 The Board Design . . . . . . . . . . . . . . . . . . . . . . . . 1129 The Media Used . . . . . . . . . . . . . . . . . . . . . . . . . 1129 Data Structures . . . . . . . . . . . . . . . . . . . . . . . . . 1130 Game Logic . . . . . . . . . . . . . . . . . . . . . . . . . . . 1131 Adding SetUpGame() . . . . . . . . . . . . . . . . . . . . . . 1132 Adding InitialiseData() . . . . . . . . . . . . . . . . . . . . . . 1134 Adding InitialiseLifts() . . . . . . . . . . . . . . . . . . . . . . 1134 Adding InitialiseBoard() . . . . . . . . . . . . . . . . . . . . . 1135 Adding InitialiseVisuals() . . . . . . . . . . . . . . . . . . . . . 1136 Loading Models and Texture Files . . . . . . . . . . . . . . . . 1136 Adding LoadBoard() . . . . . . . . . . . . . . . . . . . . . . . 1137 Adding AddElevators() . . . . . . . . . . . . . . . . . . . . . . 1137 Adding LoadPlayerCharacter() . . . . . . . . . . . . . . . . . . 1138 Adding LoadDice() . . . . . . . . . . . . . . . . . . . . . . . . 1138 Adding PositionCameras() . . . . . . . . . . . . . . . . . . . . 1138 Adding RollDice() . . . . . . . . . . . . . . . . . . . . . . . . 1142 Adding MovePlayer() . . . . . . . . . . . . . . . . . . . . . . . 1143 Adding UseElevator() . . . . . . . . . . . . . . . . . . . . . . 1146 Adding MovePlayerToElevator() . . . . . . . . . . . . . . . . . 1147 Adding TurnPlayer() . . . . . . . . . . . . . . . . . . . . . . . 1148 Adding MoveOntoPlatform() . . . . . . . . . . . . . . . . . . . 1148
Adding MoveElevator() . . . . . . . . . . . . . . . . . . . . . . 1148 Adding MoveOffPlatform() . . . . . . . . . . . . . . . . . . . . 1149 Adding ReturnElevator() . . . . . . . . . . . . . . . . . . . . . 1150 Adding RepositionCamera() . . . . . . . . . . . . . . . . . . . 1150 Fixing the Shortcomings . . . . . . . . . . . . . . . . . . . . . . . 1151 Fixing RepositionCamera() . . . . . . . . . . . . . . . . . . . 1151 Fixing MovePlayer() . . . . . . . . . . . . . . . . . . . . . . . 1152 Fixing UseElevator() . . . . . . . . . . . . . . . . . . . . . . . 1153 Fixing MovePlayerToElevator() . . . . . . . . . . . . . . . . . 1153 Fixing MoveElevator() . . . . . . . . . . . . . . . . . . . . . . 1153 Adding EndGame() . . . . . . . . . . . . . . . . . . . . . . . 1154 Game Review . . . . . . . . . . . . . . . . . . . . . . . . . . . . 1154 Solutions.....................................................................................................1155
Chapter 43
Binary Space Partitioning ...........................................................................1164 Introduction . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 1164 Creating a BSP File . . . . . . . . . . . . . . . . . . . . . . . . . 1165 Using BSP Files . . . . . . . . . . . . . . . . . . . . . . . . . . . 1165 The LOAD BSP Statement . . . . . . . . . . . . . . . . . . . . 1165 The SET BSP CAMERA COLLISION Statement . . . . . . . . 1167 The SET BSP OBJECT COLLISION Statement . . . . . . . . . 1167 The SET BSP CAMERA COLLISION RADIUS Statement . . . 1169 The SET BSP OBJECT COLLISION RADIUS Statement . . . . 1169 The SET BSP COLLISION HEIGHT ADJUSTMENT Statement 1170 The SET BSP COLLISION THRESHOLD Statement . . . . . . 1171 The PROCESS BSP COLLISION Statement . . . . . . . . . . 1171 The SET BSP COLLISION OFF Statement . . . . . . . . . . . 1171 The BSP COLLISION HIT Statement . . . . . . . . . . . . . . 1172 The BSP COLLISION Statement . . . . . . . . . . . . . . . . 1172 The SET BSP CAMERA Statement . . . . . . . . . . . . . . . 1173 The DELETE BSP Statement . . . . . . . . . . . . . . . . . . 1173 The SET BSP MULTITEXTURING Statement . . . . . . . . . . 1173 Summary . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 1173 Using a BSP Map .......................................................................................1175 Introduction . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 1175 The Program . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 1175 Solutions.....................................................................................................1178
Chapter 44
Creating Terrain
Creating Terrain .........................................................................................1180 Introduction . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 1180 Documented Terrain Statements . . . . . . . . . . . . . . . . . . . 1180 The MAKE TERRAIN Statement . . . . . . . . . . . . . . . . . 1180
The DELETE TERRAIN Statement . . . . . . . . . . . . . . . 1181 The POSITION TERRAIN Statement . . . . . . . . . . . . . . 1182 The TERRAIN POSITION Statement . . . . . . . . . . . . . . 1183 The TEXTURE TERRAIN Statement . . . . . . . . . . . . . . 1183 The GET TERRAIN HEIGHT Statement . . . . . . . . . . . . . 1184 The GET TOTAL TERRAIN HEIGHT Statement . . . . . . . . 1186 The Advanced Terrain Statements . . . . . . . . . . . . . . . . . . 1186 The MAKE OBJECT TERRAIN Statement . . . . . . . . . . . 1186 The SET TERRAIN HEIGHTMAP Statement . . . . . . . . . . 1187 The SET TERRAIN SCALE Statement . . . . . . . . . . . . . 1187 The SET TERRAIN TEXTURE Statement . . . . . . . . . . . . 1188 The BUILD TERRAIN Statement . . . . . . . . . . . . . . . . 1188 The SET TERRAIN TILING Statement . . . . . . . . . . . . . 1189 The SET TERRAIN LIGHT Statement . . . . . . . . . . . . . . 1190 The SET TERRAIN SPLIT Statement . . . . . . . . . . . . . . 1191 The GET TERRAIN GROUND HEIGHT Statement . . . . . . . 1191 The GET TERRAIN SIZE Statement . . . . . . . . . . . . . . 1193 The SAVE TERRAIN Statement . . . . . . . . . . . . . . . . . 1193 The LOAD TERRAIN Statement . . . . . . . . . . . . . . . . . 1194 Terrains as Objects . . . . . . . . . . . . . . . . . . . . . . . 1195 Summary . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 1195 Documented Statements . . . . . . . . . . . . . . . . . . . . . 1195 Undocumented (Advanced Terrain) Statements . . . . . . . . . 1196 Terrain Project............................................................................................1197 Introduction . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 1197 Creating the Game . . . . . . . . . . . . . . . . . . . . . . . . . . 1197 Constants and Global Variables . . . . . . . . . . . . . . . . . 1198 Adding StartUpGame() . . . . . . . . . . . . . . . . . . . . . . 1198 Adding PositionCamera() . . . . . . . . . . . . . . . . . . . . 1199 Adding CreateScene() . . . . . . . . . . . . . . . . . . . . . . 1199 Adding LoadTerrain() . . . . . . . . . . . . . . . . . . . . . . 1199 Adding CreateSkyBox() . . . . . . . . . . . . . . . . . . . . . 1200 Adding LoadOcean() . . . . . . . . . . . . . . . . . . . . . . . 1200 Adding PlaceOrb() . . . . . . . . . . . . . . . . . . . . . . . . 1201 Adding StartGame() . . . . . . . . . . . . . . . . . . . . . . . 1202 Adding ControlPlayer() . . . . . . . . . . . . . . . . . . . . . . 1202 Adding EndGame() . . . . . . . . . . . . . . . . . . . . . . . 1203 Adding Testing Features . . . . . . . . . . . . . . . . . . . . . 1204 Solutions.....................................................................................................1206
Chapter 45
Using Matrices
Matrices......................................................................................................1212 Introduction . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 1212 Creating a Matrix . . . . . . . . . . . . . . . . . . . . . . . . . . . 1213 The MAKE MATRIX Statement . . . . . . . . . . . . . . . . . 1213
The RANDOMIZE MATRIX Statement . . . . . . . . . . . . . 1214 The UPDATE MATRIX Statement . . . . . . . . . . . . . . . . 1214 The SET MATRIX HEIGHT Statement . . . . . . . . . . . . . 1215 The GET MATRIX HEIGHT Statement . . . . . . . . . . . . . 1217 The GET GROUND HEIGHT Statement . . . . . . . . . . . . . 1218 The SET MATRIX WIREFRAME Statement . . . . . . . . . . . 1219 The MATRIX WIREFRAME STATE Statement . . . . . . . . . 1220 Adding Texture to the Matrix . . . . . . . . . . . . . . . . . . . . . 1220 The PREPARE MATRIX TEXTURE Statement . . . . . . . . . 1220 The FILL MATRIX Statement . . . . . . . . . . . . . . . . . . 1222 The SET MATRIX TILE Statement . . . . . . . . . . . . . . . 1223 The SET TEXTURE TRIM Statement . . . . . . . . . . . . . . 1226 The SHIFT MATRIX Statement . . . . . . . . . . . . . . . . . 1227 The MATRIX TILE COUNT Statement . . . . . . . . . . . . . . 1228 The MATRIX TILES EXIST Statement . . . . . . . . . . . . . . 1228 Positioning the Matrix in 3D Space . . . . . . . . . . . . . . . . . . 1229 The POSITION MATRIX Statement . . . . . . . . . . . . . . . 1229 The MATRIX POSITION Statement . . . . . . . . . . . . . . . 1230 Matrix Transparency . . . . . . . . . . . . . . . . . . . . . . . . . 1231 The GHOST MATRIX ON Statement . . . . . . . . . . . . . . 1231 The GHOST MATRIX OFF Statement . . . . . . . . . . . . . . 1232 The SET MATRIX PRIORITY Statement . . . . . . . . . . . . 1232 Lighting the Matrix . . . . . . . . . . . . . . . . . . . . . . . . . . 1234 The SET MATRIX NORMAL Statement . . . . . . . . . . . . . 1234 The SET MATRIX Statement . . . . . . . . . . . . . . . . . . 1235 The MATRIX EXIST Statement . . . . . . . . . . . . . . . . . 1237 Summary . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 1238 Solutions.....................................................................................................1240
Chapter 46
Manipulating Vertices
Manipulating Vertices .................................................................................1246 Introduction . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 1246 The Statements . . . . . . . . . . . . . . . . . . . . . . . . . . . 1246 The LOCK VERTEXDATA FOR MESH Statement . . . . . . . 1246 The GET VERTEXDATA VERTEX COUNT Statement . . . . . 1247 The GET VERTEXDATA POSITION Statement . . . . . . . . 1248 The SET VERTEXDATA POSITION Statement . . . . . . . . . 1250 The UNLOCK VERTEXDATA Statement . . . . . . . . . . . . 1250 The LOCK VERTEXDATA FOR LIMB Statement . . . . . . . . 1251 The GET VERTEXDATA NORMALS Statement . . . . . . . . 1253 The SET VERTEXDATA NORMALS Statement . . . . . . . . . 1254 The GET VERTEXDATA Statement . . . . . . . . . . . . . . . 1255 The SET VERTEXDATA UV Statement . . . . . . . . . . . . . 1256 The SET VERTEXDATA DIFFUSE Statement . . . . . . . . . 1257 The GET VERTEXDATA DIFFUSE Statement . . . . . . . . . 1258
Handling More Complex Shapes . . . . . . . . . . . . . . . . . . . 1258 The ADD MESH TO VERTEXDATA Statement . . . . . . . . . 1265 More About the Vertex Data Buffer's Structure . . . . . . . . . . . 1266 The GET VERTEXDATA INDEX COUNT Statement . . . . . . 1267 The GET INDEXDATA Statement . . . . . . . . . . . . . . . . 1268 The SET INDEXDATA Statement . . . . . . . . . . . . . . . . 1270 The DELETE MESH FROM VERTEXDATA Statement . . . . . 1271 Summary . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 1272 Solutions.....................................................................................................1274
Chapter 47
Accessing Memory
Accessing Memory .....................................................................................1282 Introduction . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 1282 Pointers . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 1282 Creating Pointers in DarkBASIC Pro . . . . . . . . . . . . . . . 1283 Assigning a Value to a Pointer . . . . . . . . . . . . . . . . . . 1283 The MAKE MEMBLOCK Statement . . . . . . . . . . . . . . . 1283 The GET MEMBLOCK PTR Statement . . . . . . . . . . . . . 1283 Using a Pointer . . . . . . . . . . . . . . . . . . . . . . . . . . 1284 Using a Pointer to Return Values from a Function . . . . . . . . 1285 Larger Memory Blocks . . . . . . . . . . . . . . . . . . . . . . . . 1286 The WRITE MEMBLOCK Statement . . . . . . . . . . . . . . 1286 The MEMBLOCK Statement . . . . . . . . . . . . . . . . . . . 1287 The GET MEMBLOCK SIZE Statement . . . . . . . . . . . . . 1288 The DELETE MEMBLOCK Statement . . . . . . . . . . . . . . 1288 The MEMBLOCK EXIST Statement . . . . . . . . . . . . . . . 1288 The COPY MEMBLOCK Statement . . . . . . . . . . . . . . . 1289 Strings and Memory Blocks . . . . . . . . . . . . . . . . . . . 1290 The WRITE MEMBLOCK (to file) Statement . . . . . . . . . . 1292 The MAKE FILE FROM MEMBLOCK Statement . . . . . . . . 1294 The READ MEMBLOCK (from file) Statement . . . . . . . . . . 1294 The MAKE MEMBLOCK FROM FILE Statement . . . . . . . . 1296 Adding a New Top Score to our List . . . . . . . . . . . . . . . 1296 Summary . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 1297 Media Contents and Memory Blocks .........................................................1299 Introduction . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 1299 Bitmaps and Memory Blocks . . . . . . . . . . . . . . . . . . . . . 1299 The MAKE MEMBLOCK FROM BITMAP Statement . . . . . . 1299 The MAKE BITMAP FROM MEMBLOCK Statement . . . . . . 1301 Mapping a Screen Position to a Memory Block Location . . . . 1302 Mapping the Mouse Position to a Memory Block Location . . . 1303 Images and Memory Blocks . . . . . . . . . . . . . . . . . . . . . 1304 The MAKE MEMBLOCK FROM IMAGE Statement . . . . . . . 1304 The MAKE IMAGE FROM MEMBLOCK Statement . . . . . . . 1304 Sounds and Memory Blocks . . . . . . . . . . . . . . . . . . . . . 1305
The MAKE MEMBLOCK FROM SOUND Statement . . . . . . 1305 The MAKE SOUND FROM MEMBLOCK Statement . . . . . . 1307 3D Objects and Memory Blocks . . . . . . . . . . . . . . . . . . . 1308 The MAKE MEMBLOCK FROM MESH Statement . . . . . . . 1308 The MAKE MESH FROM MEMBLOCK Statement . . . . . . . 1311 The CHANGE MESH FROM MEMBLOCK Statement . . . . . . 1312 Summary . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 1313 Solutions.....................................................................................................1314
Chapter 48
Using ODE .................................................................................................1318 Introduction . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 1318 Basic ODE Statements . . . . . . . . . . . . . . . . . . . . . . . . 1318 The ODE CREATE DYNAMIC BOX Statement . . . . . . . . . 1318 The ODE START Statement . . . . . . . . . . . . . . . . . . . 1319 The ODE END Statement . . . . . . . . . . . . . . . . . . . . 1319 The ODE UPDATE Statement . . . . . . . . . . . . . . . . . . 1319 The ODE SET WORLD GRAVITY Statement . . . . . . . . . . 1320 The ODE CREATE STATIC BOX Statement . . . . . . . . . . 1321 The ODE CREATE DYNAMIC SPHERE Statement . . . . . . . 1322 The ODE CREATE DYNAMIC CYLINDER Statement . . . . . 1322 The ODE CREATE DYNAMIC TRIANGLE MESH Statement . . 1324 The ODE SET WORLD STEP . . . . . . . . . . . . . . . . . . 1325 The ODE CREATE STATIC TRIANGLE MESH Statement . . . 1325 The ODE SET WORLD ERP Statement . . . . . . . . . . . . . 1326 The ODE SET WORLD CFM Statement . . . . . . . . . . . . . 1327 The ODE SET CONTACT FDIR1 Statement . . . . . . . . . . 1328 The ODE SET LINEAR VELOCITY Statement . . . . . . . . . 1328 The ODE SET ANGULAR VELOCITY Statement . . . . . . . . 1331 The ODE SET BODY ROTATION Statement . . . . . . . . . . 1332 The ODE SET BODY MASS Statement . . . . . . . . . . . . . 1332 The ODE DESTROY OBJECT Statement . . . . . . . . . . . . 1334 The ODE GET BODY LINEAR VELOCITY Statement . . . . . 1335 The ODE GET BODY HEIGHT Statement . . . . . . . . . . . . 1335 The ODE COLLISION MESSAGE EXISTS Statement . . . . . 1336 The ODE COLLISION GET MESSAGE Statement . . . . . . . 1336 The ODE GET OBJECT Statement . . . . . . . . . . . . . . . 1336 The ODE GET OBJECT VELOCITY Statement . . . . . . . . . 1337 The ODE GET OBJECT ANGULAR VELOCITY Statement . . . 1338 The ODE ADD FORCE Statement . . . . . . . . . . . . . . . . 1338 Surface Contact Statements . . . . . . . . . . . . . . . . . . . . . 1340 Summary . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 1343 Solutions.....................................................................................................1345
Chapter 49
3D Vectors..................................................................................................1350 Introduction . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 1350 A Mathematical Description of 3D Vectors . . . . . . . . . . . . 1350 What is a 3D Vector in DarkBASIC Pro? . . . . . . . . . . . . 1351 Why do we need 3D Vectors? . . . . . . . . . . . . . . . . . . 1351 3D Vector Statements . . . . . . . . . . . . . . . . . . . . . . . . 1351 The MAKE VECTOR3 Statement . . . . . . . . . . . . . . . . 1351 The SET VECTOR3 Statement . . . . . . . . . . . . . . . . . 1352 Retrieving Data from a 3D Vector . . . . . . . . . . . . . . . . 1352 The DELETE VECTOR3 Statement . . . . . . . . . . . . . . . 1353 The COPY VECTOR3 Statement . . . . . . . . . . . . . . . . 1353 The MULTIPLY VECTOR3 Statement . . . . . . . . . . . . . . 1354 The SCALE VECTOR3 Statement . . . . . . . . . . . . . . . . 1354 The DIVIDE VECTOR3 Statement . . . . . . . . . . . . . . . . 1355 The LENGTH VECTOR3 Statement . . . . . . . . . . . . . . . 1355 The SQUARED LENGTH VECTOR3 Statement . . . . . . . . 1356 The ADD VECTOR3 Statement . . . . . . . . . . . . . . . . . 1356 The SUBTRACT VECTOR3 Statement . . . . . . . . . . . . . 1357 The DOT PRODUCT VECTOR3 Statement . . . . . . . . . . . 1357 The NORMALIZE VECTOR3 Statement . . . . . . . . . . . . . 1358 The IS EQUAL VECTOR3 Statement . . . . . . . . . . . . . . 1359 The MAXIMIZE VECTOR3 Statement . . . . . . . . . . . . . . 1359 The MINIMIZE VECTOR3 Statement . . . . . . . . . . . . . . 1360 The CROSS PRODUCT VECTOR3 Statement . . . . . . . . . 1360 Summary . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 1361 4D Vectors..................................................................................................1363 Introduction . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 1363 Matrices......................................................................................................1365 Introduction . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 1365 Matrix Statements . . . . . . . . . . . . . . . . . . . . . . . . . . 1365 The MAKE MATRIX4 Statement . . . . . . . . . . . . . . . . . 1365 The SET IDENTITY MATRIX4 Statement . . . . . . . . . . . . 1366 The IS IDENTITY MATRIX4 Statement . . . . . . . . . . . . . 1366 Other Matrix Assignment Statements . . . . . . . . . . . . . . 1367 The COPY MATRIX4 Statement . . . . . . . . . . . . . . . . . 1367 The IS EQUAL MATRIX4 Statement . . . . . . . . . . . . . . 1367 The ADD MATRIX4 Statement . . . . . . . . . . . . . . . . . 1368 The SUBTRACT MATRIX4 Statement . . . . . . . . . . . . . . 1368 The DIVIDE MATRIX4 Statement . . . . . . . . . . . . . . . . 1368 The MULTIPLY MATRIX4 Statement . . . . . . . . . . . . . . 1369 The INVERSE MATRIX4 Statement . . . . . . . . . . . . . . . 1370 The SCALE MATRIX4 Statement . . . . . . . . . . . . . . . . 1370 The TRANSLATE MATRIX4 Statement . . . . . . . . . . . . . 1371 The ROTATE MATRIX4 Statement . . . . . . . . . . . . . . . 1371
The TRANSPOSE MATRIX4 Statement . . . . . . . . . . . . . 1372 The DELETE MATRIX4 Statement . . . . . . . . . . . . . . . 1372 Summary . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 1372 Solutions.....................................................................................................1374
Chapter 50
Shaders
Shaders and FX Files.................................................................................1376 Introduction . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 1376 Vertex Shader . . . . . . . . . . . . . . . . . . . . . . . . . . . . 1376 Pixel Shader . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 1376 FX Files . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 1377 Graphics Card Check Statements . . . . . . . . . . . . . . . . . . 1377 The GET MAXIMUM VERTEX SHADER VERSION Statement . 1377 The GET MAXIMUM PIXEL SHADER VERSION Statement . . 1377 FX Statements . . . . . . . . . . . . . . . . . . . . . . . . . . . . 1378 The LOAD EFFECT Statement . . . . . . . . . . . . . . . . . 1378 The EFFECT EXIST Statement . . . . . . . . . . . . . . . . . 1378 The PERFORM CHECKLIST FOR EFFECT ERRORS Statement . . . 1379 The SET OBJECT EFFECT Statement . . . . . . . . . . . . . 1379 The SET EFFECT ON Statement . . . . . . . . . . . . . . . . 1380 The DELETE EFFECT Statement . . . . . . . . . . . . . . . . 1381 The SET LIMB EFFECT Statement . . . . . . . . . . . . . . . 1381 The PERFORM CHECKLIST FOR EFFECT VALUES Statement1382 The SET EFFECT CONSTANT Statement . . . . . . . . . . . 1383 The SET EFFECT TECHNIQUE Statement . . . . . . . . . . . 1383 The SET EFFECT TRANSPOSE Statement . . . . . . . . . . 1384 Vertex Shader Statements . . . . . . . . . . . . . . . . . . . . . . 1383 The CREATE VERTEX SHADER FROM FILE Statement . . . 1383 The SET VERTEX SHADER ON Statement . . . . . . . . . . . 1385 The SET VERTEX SHADER OFF Statement . . . . . . . . . . 1385 The DELETE VERTEX SHADER Statement . . . . . . . . . . 1385 Other Vertex Shader Statements . . . . . . . . . . . . . . . . 1386 Pixel Shader Statements . . . . . . . . . . . . . . . . . . . . . . . 1386 Summary . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 1386 FX Files . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 1386 Shader Files . . . . . . . . . . . . . . . . . . . . . . . . . . . 1387 Solutions.....................................................................................................1388
Chapter 51
Network Programming
Networked Games......................................................................................1390 Introduction . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 1390 Hardware Requirements . . . . . . . . . . . . . . . . . . . . . . . 1390 Getting Started . . . . . . . . . . . . . . . . . . . . . . . . . . . . 1390 The PERFORM CHECKLIST FOR NET CONNECTIONS Statement . 1391
TCP/IP . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 1392 The SET NET CONNECTION Statement . . . . . . . . . . . . 1392 The CREATE NET GAME Statement . . . . . . . . . . . . . . 1394 Writing Code for the Client Machine . . . . . . . . . . . . . . . . . 1395 The PERFORM CHECKLIST FOR NET SESSIONS Statement 1395 The JOIN NET GAME Statement . . . . . . . . . . . . . . . . 1396 The PERFORM CHECKLIST FOR NET PLAYERS Statement . 1397 Using a Single Machine as Both Host and Client . . . . . . . . . . 1498 Combining the Host/Client Requirements . . . . . . . . . . . . . . 1499 Communicating . . . . . . . . . . . . . . . . . . . . . . . . . . . . 1401 The SEND NET MESSAGE Statement (Version 1) . . . . . . . 1401 The GET NET MESSAGE Statement . . . . . . . . . . . . . . 1401 The NET MESSAGE EXISTS Statement . . . . . . . . . . . . 1402 The NET MESSAGE Statement (Version 1) . . . . . . . . . . . 1402 The NET MESSAGE PLAYER FROM Statement . . . . . . . . 1403 The NET MESSAGE PLAYER TO Statement . . . . . . . . . . 1403 The SEND NET MESSAGE Statement (Version 2) . . . . . . . 1404 The NET MESSAGE Statement (Version 2) . . . . . . . . . . . 1405 The NET MESSAGE TYPE Statement . . . . . . . . . . . . . 1406 The NET BUFFER SIZE Statement . . . . . . . . . . . . . . . 1408 Session Dynamics . . . . . . . . . . . . . . . . . . . . . . . . . . 1409 The NET PLAYER CREATED Statement . . . . . . . . . . . . 1409 The NET PLAYER DESTROYED Statement . . . . . . . . . . 1409 The NET GAME NOW HOSTING Statement . . . . . . . . . . 1411 The FREE NET GAME Statement . . . . . . . . . . . . . . . . 1411 The CREATE NET PLAYER Statement . . . . . . . . . . . . . 1412 The FREE NET PLAYER Statement . . . . . . . . . . . . . . . 1412 The NET GAME EXISTS Statement . . . . . . . . . . . . . . . 1413 The NET GAME LOST Statement . . . . . . . . . . . . . . . . 1413 Summary . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 1413 A Networked Game ....................................................................................1415 Introduction . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 1415 A Non-Networked Version . . . . . . . . . . . . . . . . . . . . . . 1415 Program Data . . . . . . . . . . . . . . . . . . . . . . . . . . 1415 Game Logic . . . . . . . . . . . . . . . . . . . . . . . . . . . 1416 Adding SetUpPlayerDetails() . . . . . . . . . . . . . . . . . . 1417 Adding SetUpScreen() . . . . . . . . . . . . . . . . . . . . . . 1417 Adding SetUpBoard() . . . . . . . . . . . . . . . . . . . . . . 1417 Adding GetMove() . . . . . . . . . . . . . . . . . . . . . . . . 1417 Adding GetMyMove() . . . . . . . . . . . . . . . . . . . . . . 1418 Adding GetSquare() . . . . . . . . . . . . . . . . . . . . . . . 1418 Adding InRange() . . . . . . . . . . . . . . . . . . . . . . . . 1418 Adding GetOpponentsMove() . . . . . . . . . . . . . . . . . . 1419 Adding CheckForWin() . . . . . . . . . . . . . . . . . . . . . . 1419 Adding the Other Search Routines . . . . . . . . . . . . . . . 1420 Adding EndGame() . . . . . . . . . . . . . . . . . . . . . . . 1422
Networking the Game . . . . . . . . . . . . . . . . . . . . . . . . 1423 Updating the main section . . . . . . . . . . . . . . . . . . . . 1423 Adding WaitForSecondPlayer() . . . . . . . . . . . . . . . . . 1423 Adding NumberOfPlayers() . . . . . . . . . . . . . . . . . . . 1423 Modifying the Call to SetUpPlayerDetails() . . . . . . . . . . . 1424 Modifying GetMyMove() . . . . . . . . . . . . . . . . . . . . . 1424 Modifying GetOpponentsMove() . . . . . . . . . . . . . . . . . 1424 Modifying EndGame() . . . . . . . . . . . . . . . . . . . . . . 1425 A Complete Listing . . . . . . . . . . . . . . . . . . . . . . . . 1425 Solutions ....................................................................................................1431
Chapter 52
Internet File Transfers ................................................................................1436 Introduction . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 1436 The Instructions . . . . . . . . . . . . . . . . . . . . . . . . . . . 1436 The FTP CONNECT Statement . . . . . . . . . . . . . . . . . 1436 The GET FTP FAILURE Statement . . . . . . . . . . . . . . . 1436 The GET FTP ERROR$ Statement . . . . . . . . . . . . . . . 1437 The GET FTP STATUS Statement . . . . . . . . . . . . . . . 1437 The FTP SET DIR Statement . . . . . . . . . . . . . . . . . . 1438 The GET FTP DIR$ Statement . . . . . . . . . . . . . . . . . 1438 The FTP FIND FIRST Statement . . . . . . . . . . . . . . . . 1438 The FTP FIND NEXT Statement . . . . . . . . . . . . . . . . . 1439 The GET FTP FILE TYPE Statement . . . . . . . . . . . . . . 1439 The GET FTP FILE NAME$ Statement . . . . . . . . . . . . . 1439 The GET FTP FILE SIZE Statement . . . . . . . . . . . . . . . 1439 The FTP DISCONNECT Statement . . . . . . . . . . . . . . . 1440 The FTP GET FILE Statement . . . . . . . . . . . . . . . . . . 1440 The FTP PROCEED Statement . . . . . . . . . . . . . . . . . 1441 The GET FTP PROGRESS Statement . . . . . . . . . . . . . 1442 The FTP TERMINATE Statement . . . . . . . . . . . . . . . . 1442 The FTP DELETE FILE statement . . . . . . . . . . . . . . . . 1442 The FTP PUT FILE Statement . . . . . . . . . . . . . . . . . . 1443 Summary . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 1443
Chapter 53
Creating New DBPro Statements...............................................................1446 Introduction . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 1446 A Dynamic Link Library (DLL) . . . . . . . . . . . . . . . . . . . . 1446 Creating a DLL . . . . . . . . . . . . . . . . . . . . . . . . . . . . 1446 Starting Up Visual Studio . . . . . . . . . . . . . . . . . . . . 1446 Adding the Code for New Statements . . . . . . . . . . . . . . 1448 Adding a String Table . . . . . . . . . . . . . . . . . . . . . . 1449 Constructing the Caption . . . . . . . . . . . . . . . . . . . . . 1450
Adding the New Statements to DarkBASIC Pro . . . . . . . . . 1451 Adding Help . . . . . . . . . . . . . . . . . . . . . . . . . . . 1452 Adding More New Commands . . . . . . . . . . . . . . . . . . . . 1456 Functions that Return Real Values . . . . . . . . . . . . . . . 1456 Functions that Return Strings . . . . . . . . . . . . . . . . . . 1456 More String Handling Functions . . . . . . . . . . . . . . . . . 1459 Summary . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 1460 Using Standard DLLs .................................................................................1462 Introduction . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 1462 The LOAD DLL Statement . . . . . . . . . . . . . . . . . . . . 1463 The DLL EXIST Statement . . . . . . . . . . . . . . . . . . . . 1463 The CALL DLL Statement . . . . . . . . . . . . . . . . . . . . 1463 The DLL CALL EXIST Statement . . . . . . . . . . . . . . . . 1464 The DELETE DLL Statement . . . . . . . . . . . . . . . . . . 1464 Summary . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 1465 Solutions.....................................................................................................1467
Acknowledgements
I would like to thank all those who helped me prepare the final draft of this book. In particular, Virginia Marshall who proof-read the original script and Michael Kerr who did an excellent job of checking the technical contents. Mark Armstrong researched all the difficult bits for me and produced almost as much in the way of notes as is in this final text. Any errors that remain are probably due to the usual extra paragraphs I added after all the proof-reading was complete!
Thanks also to The Game Creators Ltd for producing an excellent piece of software - DarkBASIC Professional. Many of the 3D models and textures are from The Game Creators Dark Matter 1 package and used with their kind permission.
Finally, thank you to every one of you who has bought this book. Any constructive comments would be most welcome. Email me at [email protected].
Introduction
Welcome to the second volume of a book that I hope is a little different from any other you've come across before. Instead of just telling you about software design and programming, it makes you get involved. There's plenty of work for you to do since the book is full of exercises - most of them programming exercises - but you also get a full set of solutions, just in case you get stuck! If you've worked your way through Volume 1, then you should have gained a good grounding in, not only DarkBASIC Pro, but also professional programming skills. Most of Volume 2 is dedicted to 3D graphics but there a few other interesting topics such as network programming and how to create your own DarkBASIC commands.
Learn by Doing
The only way to become a programming expert is to practice. No one ever learned any skill by just reading about it! Hence, this is not a text book where you can just sit back in a passive way and read from cover to cover whilst sitting in your favourite chair. Rather it is designed as a teaching package in which you will do most of the work. The tasks embedded in the text are included to test your understanding of what has gone before and as a method of helping you retain the knowledge you have gained. It is therefore important that you tackle each task as you come to it. Also, many of the programming exercises are referred to, or expanded, in later pages so it is important that you are familar with the code concerned.
2.
3.
make only a half-hearted attempt at tackling them before looking up the answer (there are solutions at the end of each chapter). Once you have attempted a task, look at the solution given. Often there will be important points emphasised in the solution which will aid higher understanding. 4. As you progress through the book, go back and re-read earlier chapters, since you will often get something new from them as your knowledge increases.
Syntax Diagrams
The format of each statement is explained using a syntax diagram. Raised tiles represent keywords of the language while sunken tiles are parts of the statement for which you are free to create your own values. Parts within square brackets are optional while braces represent a choice of options. Statements that return a value show this using an arrowed line and the type of value returned.
Braces represent choice Raised tiles represent keywords Sunken tiles represent programmer-assigned values
X Y Z
LIMB
OFFSET
objno
limbno
real
might appear as
POSITION OBJECT 2,OBJECT POSITION X(2), OBJECT POSITION Y(2)-0.1,OBJECT POSITION Z(2)+0.1
In such cases you should enter the code as a single line when creating a DarkBASIC Pro program.
30
3D Coordinate System 3D Primitives 3D Vectors Cameras Lights Vertex and Surface Normals Rotation Textures The Major Planes in 3D Vertices, Edges and Polygons Wireframe Models World Units
743
The 3D World
Introduction
Welcome to the world of 3D. Of course, we can create great games in 2D - many people still consider 2D games like Space Invaders and Pac-Man to be some of the best games ever invented - but for sheer eye candy you really can't beat 3D. In this chapter we'll get a broad view of the 3D world created by computers. We'll cover the basic concepts and define some of the terms. Many of these concepts will be explained in greater detail in later chapters as we discover how DarkBASIC Pro implements many of these ideas.
+y
+z -x
+x -z
-y
In the figure above, the axes have been skewed slightly to give a better perspective In reality the x-axis runs across the screen, the y-axis runs up and down, and the z-axis points directly out of the screen (-z) and into the screen (+z) (see FIG-30.2).
744
FIG-30.2
3D Axes and the Viewer
The computer screen The viewer
+y
+z -x
+x -z
-y
Planes
In mathematics, a plane is a flat surface with only two dimensions. 3D space has three main planes: the X-Y plane, the X-Z plane and the Y-Z plane (see FIG-30.3). FIG-30.3
The Main 3D Planes
+y
+x -z
-y
+y
+z -x
+x -z
-y
+y
+z -x +x -z
-y
745
The X-Y plane has the x and y axes passing through its centre and, like every plane, expands to infinity in all directions. The X-Z plane has the x and z axes at its centre, and the Y-Z plane has the y and z axes at its centre. These three planes are important since each divides space into two equally sized areas. The X-Y plane splits space with one half to the front, the other half to the back. The X-Z planes splits space into above and below sections, and the Y-Z plane splits space into left and right sections. With all three planes in place, space is split into eight equally-sized sections. Each of these sections is known as an octant. Of course, not all planes lie on axes; there are an infinite number of planes, some parallel to the main planes, others at angles to those planes, but it is the main planes that will be useful in many of the calculations required when determining the position of an object in 3D space.
Points
To specify the position of a point in 3D space we state its distance from the origin along all three axes in the order, x, y, z (see FIG-30.4).
FIG-30.4
Determining the Position of a Point in 3D Space
+y
A point in space
+z -x
+x -z
1 Measure the points distance out from the origin along the x-axis
-y
+y
+z
+x -z
-y
746
FIG-30.4
(continued) Determining the Position of a Point in 3D Space
+y
+z -x
-xMeasure the points distance out from the origin-z along the z-axis
+x
-y
We might, for example, state that point p is at the position (8,12,5) meaning that point p is 8 units along the x-axis, 12 units along the y-axis and 5 units along the z-axis.
World Units
Distances are measured in units. These units have no relationship to real-life measurements such as centimetres or inches. Instead, objects are constructed in such a way as to be the correct size relative to other objects. For example, if we make a human character 6 units high, then a simple house might be 18 to 25 units high. Of course, if you wish, you can think of 1 unit being the equivalent of a real distance. The scale you choose will depend on the context; when creating a world with an ant as the main character, 1 unit might be equivalent to a millimetre, while a truly interstellar game might make 1 unit equivalent to 1 light year.
Local Axes
Every 3D object we create has its own local axes. These axes are (initially, at least) aligned to the world axes. FIG-30.5 shows a cuboid and its local axes.
FIG-30.5
Each Object has its Own Local Axes
+y
+z -x
+x -z
Each 3D object has its own local axes parallel to the world axes
-y
747
Rotation
An object can be made to rotate about its own, local, axes. In DarkBASIC Pro rotation is measured in degrees. For example, we might rotate an object 30 degrees about it's x-axis as shown in FIG-30.6.
Initial Position Y-axis
FIG-30.6
A Cuboid is Rotated 30o about the x-axis
Y-axis
Z-axis
X-axis
Z-axis
X-axis
Rotation is performed in a clockwise direction when viewed down the positive end of an axis (see FIG-30.7). FIG-30.7
Clockwise Rotation
Axi s
Rotation is in a clockwise direction
3D Vectors
Although the purpose of this chapter is to describe basic 3D concepts, it's worth mentioning that DarkBASIC Pro allows the creation of a 3-element vector specifically for storing the coordinates of a point in 3D space. The vector is created using the MAKE VECTOR3 statement which has the format shown in FIG-30.8. FIG-30.8
The MAKE VECTOR3 Statement
MAKE
VECTOR3
vectno
integer
In the diagram: vectno is an integer value giving the ID to be assigned to the 3D vector being created.
The statement returns 1 if the vector is created successfully; otherwise zero is returned. Usually we won't worry about the value returned and can create a 3D vector with a statement such as:
result = MAKE VECTOR3(1)
748
Many of the DarkBASIC Pro statements we'll encounter later make use of 3D vectors for storing results, so it's useful to give you this quick grounding in them at this early stage. We'll learn more on this subject in a later chapter.
Object Terminology
Just as 2D has a few basic shapes such as a line, a circle, a triangle and a rectangle, so we have a set of basic shapes (known as primitives) in 3D. These include the sphere, cylinder, cone, and cube. In FIG-30.10 we see and example of a cube. FIG-30.10
A Cube - An Example of a Primitive
solid
wireframe
The cube is shown in two ways: solid, with shading caused by the light falling on its surface, and wireframe showing how the cube is constructed. Polygon is the term used for a many-sided enclosed area. The simplest polygon (that is, the one with the least sides) is the triangle. The point where two lines of a polygon meet is known as a vertex. A triangle has three vertices (see FIG-20.11). FIG-30.11
The Vertices of a Triangle
Triangle
Vetrices
The line between two vertices is known as an edge (see FIG-30.12). FIG-30.12
Edges
Edges
Every 3D shape in a game is constructed from polygons (normally triangles), as you can see from the wireframe version of the cube shown in FIG-30.10. The greater the number of polygons used to create an object, the more detailed and realistic it will appear (see FIG-30.13). But there is a price to pay for greater detail DarkBASIC Pro: 3D - Concepts and Terminology 749
- higher processing requirements. As you increase the number of polygons that go to make up the objects in your scene, the harder your processor and video card need to work. Ask too much of your hardware, and screen updating will slow down. The number of times the screen is redrawn in one second is known as the frame rate and is quoted in frames per second (fps). If the frame rate falls much below about 20 fps, then your eyes will become aware of the screen refreshing and the picture will become jerky. FIG-30.13
Varying the Polygons in a Sphere
Textures
In solid mode (as opposed to wireframe), a 3D object has a bland grey surface, but we can use an image wrapped around that object to give it a greater reality. By wrapping the image of riveted steel plate round a sphere, we can create the illusion of a metal ball. Wrap an image of wooden planks round the same sphere and we create a wooden ball (see FIG-30.14). FIG-30.14
Adding Texture to a 3D Object
The image seen at the front of the glass depends on the paint used on the back
If we were to paint the back of the glass black, no light would get through and we wouldn't see the picture. If we used grey paint rather than black, then some light would get through. If we painted a pattern on the back of the glass using a mixture of black, dark grey, and light grey paint, the image would appear to have bright, dull and black areas depending on the paint on the back of the image. This is how the alpha channel of an image works. As well as the basic red, green and blue elements (or channels) that go to make up the image, a fourth, alpha, channel is added. This is just another layer to the image which can only be shaded using greyscale colours (white through to black). Where black is used, the original image is unseen; where white is used the image appears at normal brightness (this is where the glass analogy falls down since it would be at its brightest with no paint on the back of the glass). Shades of grey give varying degrees of image brightness. FIG-30.16 shows original images, alpha channels, and the overall effects created. FIG-30.16
Using an Alpha Channel
Cameras
The real world is a vast place, but with the help of television we can view any part of it - all we need is a camera. What the TV camera broadcasts we see on our screens. Move the camera and we see a different part of the world. This is exactly how the 3D world we create within the computer works; what we see on the computer screen is the output from a virtual camera. The camera can be moved, just like a real camera, revealing different parts of our new 3D world. We can zoom the camera in or out allowing us to enlarge a distant object or show everything within a small space. DarkBASIC Pro: 3D - Concepts and Terminology 751
We can even use several cameras, switching between each to change what the user is seeing on the screen. Unlike real life, there's never any chance of seeing a camera in the view produced by a second camera - all virtual cameras are invisible! DarkBASIC Pro creates and positions a single camera automatically at the start of every program that uses 3D objects. The exact position of the camera depends on the positioning of the 3D objects, since the camera normally places itself in order to see the objects that have been created. However, as the programmer, you can take complete control of the camera and thereby determine just exactly what appears on the screen.
Lights
We can even set up the lights we want to use to illuminate our new world - just like placing lights on a movie set. By positioning various types of lights in just the correct positions, we can create any type of atmosphere we want - from dark and mysterious to bright and sunny. Like cameras in the 3D world, the lights are invisible, but the effects they create are not! To help calculate the effect of lights on the individual polygons of a 3D object, a set of normals are maintained. A surface normal is a vector from the centre of a polygon perpendicular to the surface of that polygon. Every polygon in an object has an associated normal (see FIG-30.17). FIG-30.17
Surface Normals
Normals are stored as mathematical expressions and are not part of the visible structure of the model. In principal every polygon can have two surface normals: one on the top side and one on the bottom. However, often models only use a single normal - on the side facing outwards. When using surface normals to calculate how an object should be lit, we sometimes get a rather faceted appearance, with an obvious jump in shading from one polygon to the next (see FIG-30.18). FIG-30.18
Visible Polygons
752
To solve this, vertex normals may be used. A vertex normal is created at every vertex of a polygon (see FIG-30.19). FIG-30.19
Vertex Normals
Vertex normal Vertex normal Vertex normal Vertex normal Vertex normal Vertex normal
Vertex normal
Vertex normal
When two or more polygons have common vertices, that vertex has a separate vertex normal for each of the polygons that share the vertex.
These vertex normals are calculated from the values of the two edges which meet at that vertex. Using vertex normals creates a smoother lighting effect, but requires more calculations. You can see the effect produced in FIG-30.20. FIG-30.20
Polygon Smoothing
Activity 30.1 Load and run the program basic3D.exe. This will demonstrate some of the basic concepts covered in this chapter. (You can download this program, and all other files used in this text from www.digital-skills.co.uk) As we'll see in the chapters that follow, DarkBASIC Pro has literally hundreds of commands designed to help us create a 3D world and manipulate the objects in that world.
Summary
l The 3D world uses three axes: x, y and z. l 3D space is split into eight octants by the X-Y, X-Z and Y-Z planes.
753
l Space within the 3D world is measured in world units. These do not relate to real world units. l A point in 3D space is defined by its distance along each of the axes. l 3D objects have their own local axes. l 3D objects can be rotated about their own local axes. l Rotations are measured in degrees. l Rotation is in a clockwise direction (as viewed from the positive end of the axis of rotation). l DarkBASIC Pro provides 3D vector objects in which the coordinates of a point in 3D space can be stored. l 3D objects are constructed from polygons. l The simplest polygon is the triangle. l The end of a line within a polygon is known as a vertex. l The line between two vertices is known as an edge. l More detailed objects require more polygons. l Increasing the number of polygons used in a scene increases the load on the computer. l When faced by a heavy load, the computer will output at a reduced frame rate. l Images can be used to texture a 3D shape to increase realism. l Some images can contain alpha channels which effect lightness when the image is used to texture a surface. l Virtual cameras determine which parts of the 3D world are shown on the screen. l Lights can be added to a scene to help create the desired atmosphere. l The effects of lights on a surface are calculated using surface normals or vertex normals. l Every polygon has an associated surface normal. l A surface normal is a vector at right angles to its polygon. l Using surface normals to calculate shading can result in a patchy effect. l Every vertex of a polygon has an associated vertex normal. l Vertex normals may be used to create smoother shading effects, but at the cost of more complex calculations.
31
Absolute and Relative Object Movement Global and Local Axes Creating 3D Primitives Culling Deleting 3D Primitives Duplicating 3D Objects Merging Objects Pointing an Object in a Specific Direction Positioning 3D Objects Retrieving 3D Object Data Rotating 3D Objects Resetting Local Axes Resizing 3D Objects Showing and Hiding 3D Objects Wireframe Mode
755
3D Primitives
Introduction
DarkBASIC Pro contains several statements for creating and manipulating 3D primitives such as spheres, cones and cubes. These statements are explained in detail below. A sample of the possible shapes is shown in FIG-31.1. FIG-31.1
The 3D Shapes that can be Created in DarkBASIC Pro
Creating a Cube
The MAKE OBJECT CUBE Statement
To create a cube on the screen, we use the MAKE OBJECT CUBE statement. Like sprites, every 3D object created must be given an identifying integer value (its ID). No two 3D objects within a program can be assigned the same ID. The size of the cube is also defined in this statement, which has the format shown in FIG-31.2. FIG-31.2
The MAKE OBJECT CUBE Statement
MAKE
OBJECT
CUBE
objno
size
In the diagram: objno size is an integer value giving the ID to be assigned to the cube. is a real value specifying the width, height and depth of the cube. This value is given in world units.
This would create a cube (with ID 1) which is 10 units wide, by 10 units high, by 10 units deep. FIG-31.3 shows a screen shot of the resulting cube. FIG-31.3
A Cube in DarkBASIC Pro
This may not look too impressive as a 3D object, but thats because were looking at the cube straight on and therefore can only see the front face of the object. 756 DarkBASIC Pro: 3D Primitives
The cube shown above was created using the program given in LISTING-31.1. LISTING-31.1
Creating a Cube Statements such as COLOR BACKDROP and BACKDROP ON were covered in Volume 1. REM *** Set display resolution and backdrop *** SET DISPLAY MODE 1280,1024,32 COLOR BACKDROP 0 BACKDROP ON REM *** Make the cube *** MAKE OBJECT CUBE 1,10 REM *** End program *** WAIT KEY END
Activity 31.1 Type in the program in LISTING-31.1 (object3D01.dbpro) and check that you get the same display as shown above. When any of the 3D primitives is first created, its centre is positioned at the origin. FIG-31.4 shows a model of what has been created by the program in LISTING-31.1. The 3 axes and parts of the XZ and YZ planes have been included to give a clearer picture of how the cube is positioned. FIG-31.4
How the Cube is Positioned by the Program
y-axis
z-axis
10
un
it s
10
unit
10 units
x-axis
FIG-31.5
The MAKE OBJECT BOX Statement
MAKE
OBJECT
BOX
objno
In the diagram: objno is an integer value giving the ID to be assigned to the box being created. No other 3D object in the program can be assigned the same value. is a real value giving the width (x-dimension) of the box. is a real value giving the height (y-dimension) of the box. is a real value giving the depth (z-dimension) of the box.
w h d
would create a box with ID 2 which is 10 units wide, by 3.7 units high, by 12 units deep.
MAKE
OBJECT
SPHERE
objno
diameter
rows
columns
In the diagram: objno is an integer value giving the ID assigned to the sphere being created. is a real number representing the diameter of the sphere. is an integer value specifying the number of lines of latitude making up the sphere. is an integer value specifying the number of lines of longitude making up the sphere.
diameter
rows
columns
The statement
MAKE OBJECT SPHERE 3,40.0
would create a sphere with a diameter of 40 units and assign it the ID number 3. However, the sphere produced is constructed from a relatively small number of polygons and hence its curve is not particularly smooth. By using the rows and columns values, we can control the number of polygons used to construct the sphere and thereby produce a more realistic effect. For example, the line
758
would create a much smoother sphere. FIG-31.7 shows the difference between the default sphere and the more detailed one. FIG-31.7
Creating a Smoother Sphere
However, there's a price to be paid for the more detailed sphere; the more polygons we use when creating any 3D shape, the more work the processor/video card needs to do and this reduces the frames per second that can be achieved. Activity 31.2 Modify your previous program so that a standard sphere (diameter 10) is created instead of a cube. Modify the sphere to have 40 columns by 40 rows.
MAKE
OBJECT
CYLINDER
objno
In the diagram: objno is the integer value assigned to the cylinder being created. is a real value giving the height and diameter of the cylinder. 759
For example, we could make a cylinder of height 31.5 units using the statement:
MAKE OBJECT CYLINDER 4,31.5
MAKE
OBJECT
CONE
objno
In the diagram: objno is the integer value assigned to the cone being created. is a real value giving the height of the cone and the diameter of its base.
For example, we could make a cone of height 10.1 units using the statement:
MAKE OBJECT CONE 5,10.1
Activity 31.3 Modify your previous program to display a cylinder of diameter 5. Modify the program again to show a cone of the same height as the cylinder.
MAKE
OBJECT
PLAIN
objno
In the diagram: objno is the integer value assigned to the plane being created. is a real value giving the width of the plane. is a real value giving the height of the plane.
w h
For example, we could create a plane which is 1000 units wide by 500 high using the line:
MAKE OBJECT PLAIN 6,1000.0,500.0
The centre of the plane will be located at the origin (see FIG-31.11). 760 DarkBASIC Pro: 3D Primitives
FIG-31.11
How a Plane is Positioned when First Created
MAKE
OBJECT
TRIANGLE
objno
,
z2
x1
,
x3
y1
, ,
z1
x2
y2
y3
z3
In the diagram: objno is the integer value assigned to the triangle being created. are real numbers representing the position of the first vertex. are real numbers representing the position of the second vertex. are real numbers representing the position of the third vertex.
x1,y1,z1
x2,y2,z2
x3,y3,z3
The line
The additional spacing used within the instruction is used to highlight the various parameter groupings. MAKE OBJECT TRIANGLE 7, 2,0,3, 5,0,3, 3.5,6,7
761
FIG-31.13
Creating a Triangle Object
y-axis
(3.5,6,7)
z-axis
(2,0,3)
(5,0,3)
x-axis
Notice that, unlike any of the other objects, a triangle can be placed anywhere in 3D space.
Positioning an Object
Other than the triangle, every object is created with its centre at the point (0,0,0). However, once an object has been created, DarkBASIC Pro offers several ways of moving an object to another position.
POSITION
OBJECT
objno
In the diagram: objno x,y,z is the integer value previously assigned to the object. are real values representing the position to which the object is to be moved. It is the centre of the object that is placed at this position.
For example, if we wanted the centre of the cube we had created previously to be moved to position (9,0,0), then we would use the statement:
POSITION OBJECT 1,9,0,0
762
FIG-31.15
The Result of Moving the Cube to (9,0,0)
y-axis
z-axis
x-axis
LISTING-31.2
Moving the Cube
LISTING-31.2 is a modification of the previous listing which moves the cube to position (9,0,0) after the user presses a key. The new lines have been highlighted.
REM *** Set display resolution and backdrop *** SET DISPLAY MODE 1280,1024,32 COLOR BACKDROP 0 BACKDROP ON REM *** Make the cube ** MAKE OBJECT CUBE 1, 10 REM *** Move cube to (9,0,0) after key press *** WAIT KEY POSITION OBJECT 1,9,0,0 REM *** End program *** WAIT KEY END
Activity 31.4 Modify your previous program to match that given in LISTING-31.2. Add the lines
REM *** Move the cube backwards *** WAIT KEY POSITION OBJECT 1, 9,0,30
so that the object is moved for a second time. Notice that, in its final position, the cube looks smaller since it has now moved further away from our viewing position.
763
Activity 31.5 Write a program (object3D02.dbpro) to create the following objects, and then position each as specified: Object Number 1 2 3 4 5 Object Type CUBE BOX SPHERE CYLINDER CONE Dimensions 4 10,15,5 7 12 12 Final Position 9,0,0 -60,0,100 -30,-40,50 25,0,120 0,25,100
Add a WAIT KEY statement between each move. The screen should appear as shown below.
Screen at Start
Screen at End
MOVE
OBJECT
In the diagram:
{}
UP DOWN LEFT RIGHT
objno
dist
UP, DOWN, LEFT, RIGHT One of these keywords must be used to indicate in which direction the object is to be moved. objno is an integer value giving the ID of the object to be moved. DarkBASIC Pro: 3D Primitives
764
dist
MOVE OBJECT UP
Notice that there is no option to move the object backwards or forwards (i.e. along the z-axis). For example, object 1 could be moved 10.5 units to the right using the statement:
MOVE OBJECT RIGHT 1,10.5
Activity 31.6 Create a new program (object3D03.dbpro) containing a cube of size 10. Use POSITION OBJECT to place the cube at (9,0,100). Now move the cube 31.3 units to the right. Place a WAIT KEY statement before each action.
z-axis
World Axes
z-axis
x-axis
x-axis
FIG-31.19
Possible Rotations about Local Axes
local x-axis
Rotation about the x-axis Rotation about the y-axis Rotation about the z-axis
local z-axis
local y-axis
XROTATE
OBJECT
objno
angle
In the diagram: objno angle is the integer value specifying the object. is a real number giving the angle (in degrees) to which the object is to be rotated.
For example, an existing cube could be rotated about the x-axis to 45o using the line
XROTATE OBJECT 1, 45.0
Cube 0 rotation
Cube at 45 rotation
Activity 31.7 Write a program (object3D04.dbpro) which implements the following logic:
Set screen resolution to 1280 by 1024 Create a cube (40 units in size) Move the cube to (0,0,100) FOR degree := 1 TO 360 DO Rotate cube to @ACHAAo around the x-axis. Wait 1 millisecond ENDFOR
Run the program and check that it performs as expected. Modify the program so that the cube revolves in the opposite direction about the x-axis.
766
YROTATE
OBJECT
objno
angle
In the diagram: objno angle is the integer value previously assigned to the object. is a real number giving the angle (in degrees) to which the object is to be rotated.
For example, a cube (ID 1) could be rotated about its y-axis to 60o using the line:
YROTATE OBJECT 1, 60.0
ZROTATE
OBJECT
objno
angle
In the diagram: objno angle is the integer value previously assigned to the object. is a real number giving the angle (in degrees) to which the object is to be rotated.
For example, a cube (ID 1) could be rotated about the z-axis to 110o using the line:
ZROTATE OBJECT 1, 110.0
767
The program in LISTING-31.3 revolves a cube about all three axes at the same time. LISTING-31.3
Rotating an Object about all Three Axes REM ** Set display mode *** SET DISPLAY MODE 1280,1024,32 REM *** Create and position cube *** MAKE OBJECT CUBE 1, 40 POSITION OBJECT 1, 0, 0, 200 REM *** Rotate cube 1 degree at a time *** REM *** around all three axes *** FOR angle = 1 TO 360 XROTATE OBJECT 1, angle YROTATE OBJECT 1, angle ZROTATE OBJECT 1, angle WAIT 10 NEXT angle REM *** End program *** WAIT KEY END
Activity 31.8 Type in and test the program given above (object3D05.dbpro).
ROTATE
OBJECT
objno
xangle
yangle
zangle
In the diagram: objno xangle is the integer value previously assigned to the object. is a real number giving the angle (in degrees) to which the object is to be rotated about its x-axis. is a real number giving the angle (in degrees) to which the object is to be rotated about its y-axis. is a real number giving the angle (in degrees) to which the object is to be rotated about its z-axis.
yangle
zangle
Activity 31.9 Rewrite the program you created in the previous Activity, replacing the XROTATE, YROTATE and ZROTATE statements with a single ROTATE OBJECT statement, producing the same effect as before. All statements in the previous section rotate an object to a specific angle, 768 DarkBASIC Pro: 3D Primitives
irrespective of that objects current inclination. For example, if we use the YROTATE OBJECT statement to turn a cube to 60o, the initial angle of the cube before the statement is executed is irrelevant since the end result will be that the cube will end up at the specified angle of 60o. This type of rotation is known as absolute rotation.
SET
OBJECT
ROTATION
{ {
XYZ ZYX
objno
In the diagram: XYZ Use this option to return the order of rotations to the default x-axis, y-axis, z-axis order. Use this option to set the order of rotations to the z-axis, y-axis, x-axis order. is an integer value specifying the object whose order of rotation is to be modified.
ZYX
objno
local z-axis
LEFT
RIGHT
local x-axis
PITCH UP
RIGHT
LEFT
TURN
ROLL
local y-axis
769
{ {
DOWN UP
objno
angle
In the diagram: DOWN, UP Choose DOWN to make the object rotate clockwise (as viewed from the positive side of the y-axis); choose UP to make the object rotate anticlockwise. is the integer value previously assigned to the object. is a real number giving the angle (in degrees) to which the object is to be rotated relative to its current position. The angle can be a positive or negative value.
objno angle
The program in LISTING-31.4 performs the same function as the one you created in Activity 31.7 where you used the XROTATE statement to rotate a cube through 360o. However, this time the XROTATE statement has been replaced by a PITCH OBJECT UP command. LISTING-31.4
Using Relative Rotation REM *** Set screen resolution *** SET DISPLAY MODE 1280,1024,32 REM *** Create and position cube *** MAKE OBJECT CUBE 1, 40 POSITION OBJECT 1, 0, 0, 200 REM *** Revolve the cube *** FOR c = 1 TO 360 PITCH OBJECT UP 1, 1.0 WAIT 10 NEXT c REM *** End program *** WAIT KEY END
Activity 31.10 Type in the program given above (object3D06.dbpro) and make sure it is equivalent to the earlier program in Activity 31.7. Modify the program so that the cube rotates in the opposite direction.
{ {
LEFT RIGHT
objno
angle
770
In the diagram: LEFT, RIGHT Choose RIGHT to make the object rotate to the right about the y-axis; choose LEFT to make the object rotate to the left. is an integer value giving the ID of the object to be rotated. is a real number giving the angle (in degrees) to which the object is to be rotated relative to its current position. The angle can be a positive or negative value.
objno
angle
Activity 31.11 Modify your previous program so that the cube rotates to the right about the y-axis.
{ {
LEFT RIGHT
objno
angle
In the diagram: LEFT, RIGHT Choose RIGHT to make the object rotate to the right about the z-axis; choose LEFT to make the object rotate to the left. is an integer value giving the ID of the object to be rotated. is a real number giving the angle (in degrees) to which the object is to be rotated relative to its current position. The angle can be a positive or negative value.
objno
angle
Activity 31.12 Modify your previous program so that the cube rotates to the left about the z-axis.
771
FIG-31.32
The POINT OBJECT Statement
POINT
OBJECT
objno
In the diagram: objno is an integer value giving the ID of the object to be affected. are the coordinates of the point in space at which the main polygon of the 3D object is to face.
x,y,z
In the program shown in LISTING-31.5 a cube is made to face the point (45,45,0) using the statement:
POINT OBJECT 1,45,45,0
LISTING-31.5
Using the POINT OBJECT Statement
REM *** Set display resolution and backdrop *** SET DISPLAY MODE 1280,1024,32 COLOR BACKDROP 0 BACKDROP ON REM *** Make the set of objects *** MAKE OBJECT CUBE 1,40 REM *** Move cube to (0,0,100) after key press *** WAIT KEY POSITION OBJECT 1,0,0,100 REM *** point cube at (45,45,0)*** WAIT KEY POINT OBJECT 1,45,45,0 REM *** End program *** WAIT KEY END
After the POINT OBJECT statement is executed, the main polygon faces (45,45,0).
Activity 31.13 Type in and test the program given in LISTING-31.5 (object3D07.dbpro). Modify the program to make the cube face the point (-20,17,-10).
FIG-31.34
The MOVE OBJECT distance Statement
MOVE
OBJECT
objno
dist
In the diagram: objno is an integer value specifying the object to be moved. is a real value specifying the distance to be moved.
dist
Activity 31.14 In your previous program, immediately after the POINT OBJECT statement, add the following lines:
REM *** Move cube *** WAIT KEY MOVE OBJECT 1, 20
local y-axis
local y-axis Local Axes - Initial Position Local Axes - Cube Rotated to -90 about the z-axis
o
If we now rotate the cube about its own x-axis, it will turn left-to-right rather than up-and-over, because its x-axis has shifted position. This is demonstrated in LISTING-31.6 where the cube is rotated a full 360o about its x-axis, rotated by -90o about its z-axis and then rotated a full 360o about its x-axis for a second time. LISTING-31.6
Local Axes Move with the Object REM *** Set display resolution *** SET DISPLAY MODE 1280,1024,32 REM *** Make and position cube *** MAKE OBJECT CUBE 1,40 POSITION OBJECT 1,0,0,100 REM *** Rotate cube 360 about x-axis *** FOR degree = 0 TO 360 XROTATE OBJECT 1, degree WAIT 1 NEXT degree
773
LISTING-31.6
(continued) Local Axes Move with the Object
REM *** Rotate cube to -90 about z-axis FOR degree = 0 TO -90 STEP -1 ZROTATE OBJECT 1, degree WAIT 10 NEXT degree REM *** Rotate cube 360 about x-axis *** FOR degree = 0 TO 360 XROTATE OBJECT 1, degree WAIT 1 NEXT degree REM *** End program *** WAIT KEY END
Activity 31.15 Type in and test the program given in LISTING-31.6 (object3D08.dbpro). When an object has been rotated, it is possible to reset the local axes so that they are parallel to the main axes. This is done using the FIX OBJECT PIVOT statement whose format is shown in FIG-31.36. FIG-31.36
The FIX OBJECT PIVOT Statement
FIX
OBJECT
PIVOT
objno
In the diagram: objno is an integer value specifying the object whose local axes are to be reset.
When this statement is executed, the object in question has its local axes reset so that the x-axis lies left-to-right, the y-axis top-to-bottom, and the z-axis in-to-out (see FIG-31.37). FIG-31.37
The Effect of Using FIX OBJECT PIVOT
local x-axis local y-axis local x-axis local z-axis local z-axis
local y-axis Cube rotated -90 degrees about the z-axis Cubes local Axes are Reset
local y-axis
local y-axis
local x-axis
local z-axis
local z-axis
local x-axis
774
before the final FOR loop structure. How does this affect the rotation of the cube? Modify the program again so that the cube is only rotated to -45o in the second FOR loop. How is the cube's rotation affected this time?
Resizing Objects
It is possible to change the size of an object after it has been created. You have the option to resize one, two, or all three of the objects dimensions. This allows you to make an object uniformly larger or smaller, or to distort the original shape by changing each dimension by differing amounts.
SCALE
OBJECT
objno
xperc
yperc
zperc
In the diagram: objno is the integer value previously assigned to the 3D object. is a real number giving the new size of the objects x dimension as a percentage of its original size in that dimension. For example, a value of 100.0 will retain the current size, while 200.0 would double the objects length in the x dimension, and 50.0 would halve it. is a real number giving the new size of the objects y dimension as a percentage of its original size in that dimension. is a real number giving the new size of the objects z dimension as a percentage of its original size in that dimension.
xperc
yperc
zperc
The program in LISTING-31.7 creates a sphere with a radius of 20 units. The sphere is then resized so that the x dimension is doubled and the z dimension reduced to 10 units. The new shape is then rotated about the y-axis. The user must press ESC to terminate the program. DarkBASIC Pro: 3D Primitives 775
LISTING-31.7
Resizing an Object
REM *** Set display resolution *** SET DISPLAY MODE 1280,1024,32 REM *** Make and position the sphere ** MAKE OBJECT SPHERE 1, 20 POSITION OBJECT 1, 0,0,200 REM *** Resize sphere *** SCALE OBJECT 1, 200.0,100.0,50.0 REM *** Rotate shape *** DO TURN OBJECT RIGHT 1, 1.0 LOOP REM *** End program *** WAIT KEY END
Activity 31.17 Type in and test the program in LISTING-31.6 (object3D09.dbpro). Modify the program so that a cone is used in place of the sphere.
HIDE
OBJECT
objno
In the diagram: objno is the integer value previously assigned to the 3D object which is to be hidden.
SHOW
OBJECT
objno
In the diagram: objno is the integer value previously assigned to the hidden 3D object which is to reappear. DarkBASIC Pro: 3D Primitives
776
The program in LISTING-31.8 rotates a cube continually, hiding the cube when h is pressed and showing it again when s is pressed. LISTING-31.8
Hiding and Showing Objects REM *** Set display resolution *** SET DISPLAY MODE 1280,1024,32 REM *** Make and position cube *** MAKE OBJECT CUBE 1, 20 POSITION OBJECT 1, 0,0,200 REM *** Rotate object *** DO PITCH OBJECT UP 1, 1.0 REM *** Read key *** ch$ = INKEY$() REM *** IF its s - show cube *** IF ch$ = s SHOW OBJECT 1 ENDIF REM *** IF its h - hide cube *** IF ch$ = h HIDE OBJECT 1 ENDIF LOOP REM *** End program *** END
Activity 31.18 Type in and test the program given above (object3D10.dbpro).
DELETE
OBJECT
objno
In the diagram: objno is an integer value specifying the ID of the 3D object to be deleted.
DELETE
OBJECTS
objno1
objno2
In the diagram: objno1 objno2 is an integer value specifying the lowest ID of the 3D objects to be deleted. is an integer value specifying the highest ID of the 3D objects to be deleted. 777
For example, if we needed to delete 10 3D objects with ID values ranging from 8 to 17, then we would use the statement:
DELETE OBJECTS 8,17
Copying a 3D Object
We can create a copy of an existing 3D object in one of two ways, as described below.
CLONE
OBJECT
objno1
objno2
In the diagram: objno1 is an integer value specifying the ID to be assigned to the object being created. is an integer value specifying the ID of the existing object to be copied.
objno2
The program in LISTING-31.9 uses the CLONE OBJECT statement to create a duplicate cube. LISTING-31.9
Creating a Copy of a 3D Object REM *** Set display resolution *** SET DISPLAY MODE 1280,1024,32 REM *** Make and position cube *** MAKE OBJECT CUBE 1,40 POSITION OBJECT 1,-40,0,100 REM *** Rotate cube *** WAIT KEY XROTATE OBJECT 1 , -45 REM *** Copy cube *** WAIT KEY CLONE OBJECT 2,1 REM *** Position copy *** POSITION OBJECT 2, 40,0,50 REM *** Delete original cube *** WAIT KEY DELETE OBJECT 1 REM *** End program *** WAIT KEY END
Activity 31.19 Type in and test the program given in LISTING-31.9 (object3D11.dbpro). Is the copied cube rotated to the same angle as the original? Is the copied cube deleted when the original cube is removed?
778
INSTANCE
OBJECT
objno1
objno2
In the diagram: objno1 is an integer value specifying the ID to be assigned to the object being created. is an integer value specifying the ID of the existing object to be copied.
objno2
Although this may seem to have the same affect as the CLONE OBJECT statement, in fact the two statements differ in how data about the copied object is held. When CLONE OBJECT is used, the new object has its own independent data area; with INSTANCE OBJECT the two objects share parts of the same data area. The consequence of this is that objects created using INSTANCE OBJECT will disappear if the original object from which they were created is deleted. Activity 31.20 Modify your last program, replacing the CLONE OBJECT statement with a INSTANCE OBJECT statement. How does this change affect the operation of the program? Change the DELETE OBJECT statement so that object 2, rather than object 1, is deleted. How does this affect the program?
OBJECT
EXIST
objno
integer
779
OBJECT
POSITION
{
real
X Y Z
objno
In the diagram: X,Y,Z One of these options should be chosen. Choose X if the x-ordinate of the specified object is required, Y for the y-ordinate, and Z for the z-ordinate. is an integer value specifying the object whose ordinate is to be returned.
objno
For example, we could determine the position in space of object 1's centre using the lines:
x = OBJECT POSITION y = OBJECT POSITION z = OBJECT POSITION PRINT "Object 1 has X(1) Y(1) Z(1) its centre at (",x,",",y,",",z,")"
OBJECT
VISIBLE
objno
integer
In the diagram: objno is an integer value specifying the ID of the object to be checked.
780
OBJECT
SIZE
X Y Z
objno
real
In the diagram: X,Y,Z One of these options should be chosen. Choose X if the width of the specified object is required, Y for the height, and Z for the depth. All three options can be omitted and the statement will return an overall value for the size of the 3D object. objno is an integer value specifying the object whose dimension is to be returned.
The value returned by the statement is real and, because of rounding errors, this may be slightly out. For example, if we create a cube (object 1) 40 units in all directions, then the statement
PRINT "Width ", OBJECT SIZE X(1)
will display the value 39.9999961853. Also, the OBJECT SIZE (1) statement - with no reference to any specific dimension - gives an overall size based on all three dimensions. Activity 31.21 Write a program (object3D12.dbpro) which creates a box of random size (using limits 5 to 50) and then displays the box's width, height and depth.
781
FIG-31.49
The OBJECT ANGLE Statement
X OBJECT ANGLE Y Z
objno
real
In the diagram: X,Y,Z One of these options should be chosen. Choose X if the rotation about the local x axis is required, Y for rotation about the y-axis, and Z for the rotation about the z-axis. is an integer value specifying the object whose rotation angle is to be returned.
objno
Activity 31.22 Modify your previous program so that the box object is rotated by a random number of degrees about all three axes. Display the amount of rotation in each case.
The y ordinate also needs to have it's sign changed, since for the mouse the positive section of the y-axis is down, while in 3D space the positive section of the y-axis is up! We can solve this with the line:
y3D = -(MOUSE Y() - SCREEN HEIGHT()/2)
Of course, there is no third dimension as far as the mouse pointer is concerned, so we'll keep that set to zero. We're now ready to describe the logic required by the program:
Get mouse coordinates and convert to 3D space Make cube point at these coordinates LOOP
The code for the program is given in LISTING-31.10. LISTING-31.10
Making a 3D Object Face the Mouse Pointer REM *** Set display resolution *** SET DISPLAY MODE 1280,1024,32 REM *** Make and position cube *** MAKE OBJECT CUBE 1, 40 POSITION OBJECT 1,0,0,100 DO REM *** Convert mouse 2D coords to 3D *** x3D = MOUSEX() - SCREEN WIDTH()/2 y3D = -(MOUSEY() - SCREEN HEIGHT()/2) REM *** Re-orient cube *** POINT OBJECT 1,x3D,y3D,0 LOOP REM *** End program *** END
Activity 31.23 Type in and test the code given above (object3D13.dbpro). Modify the program to use two spheres, set side-by-side, both of which should face towards the mouse pointer.
SET
OBJECT
WIREFRAME
objno
mode
In the diagram: objno is an integer value identifying the object which is to have its display mode altered. is 0 or 1. 0 1 -
mode
LISTING-31.11 demonstrates the use of this statement, switching between solid and wireframe mode every time a key is pressed. LISTING-31.11
Switching Between Normal and Wireframe Mode REM *** Set screen mode *** SET DISPLAY MODE 1280,1024,32 REM *** Make and position cube *** MAKE OBJECT CUBE 1, 40 POSITION OBJECT 1,25,0,100 REM *** Start in solid mode *** wire = 0
LISTING-31.11
(continued) Switching Between Normal and Wireframe Mode DO
REM *** Rotate cube *** REM *** IF key pressed, switch mode *** IF INKEY$() <> "" wire = 1 - wire SET OBJECT WIREFRAME 1, wire ENDIF PITCH OBJECT DOWN 1, 1.0 TURN OBJECT LEFT 1, 1.0 LOOP REM *** End program *** END
SET
OBJECT
CULL
objno
mode
In the diagram: objno is an integer value identifying the object which is to have its cull mode altered. is 0 or 1. 0 1 -
mode
immediately before the DO..LOOP structure. Notice that the hidden polygons are now being drawn. Modify the program again so that pressing the w key toggles between wireframe and solid mode and that pressing c toggles between culling on and culling off. There's a slight problem when it comes to displaying cylinders and cones, as we can see from the output produced by LISTING-31.12.
784
LISTING-31.12
A Problem with Cones and Cylinders
REM *** Set screen mode *** SET DISPLAY MODE 1280,1024,32 REM *** Make and position cone and cylinder *** MAKE OBJECT CONE 1, 5 POSITION OBJECT 1,-6,-5,0 XROTATE OBJECT 1, 45 MAKE OBJECT CYLINDER 2,5 POSITION OBJECT 2, 6,-5,0 REM *** End program *** WAIT KEY END
Activity 31.26 Type in and test the program in LISTING-31.12 (object3D15.dbpro). What problem occurs with both shapes? The inside surfaces of both shapes have not been drawn (see FIG-31.52). FIG-31.52
Hidden Surfaces on Cones and Cylinders
But we can solve this problem by switching off culling, so that the hidden polygons are drawn. Activity 31.27 Modify your previous program so that culling is switched off for both the cone and the cylinder.
Storage Methods
When a 3D object is shown on screen, the coordinates of its vertices are stored in memory in an area known as a vertex buffer. Normally, each object will have its own vertex buffer. However, some video cards allow different objects to share vertex buffers, other video cards don't. As a default, 3D objects in DARKBASIC Pro do not share vertex buffers - this ensures compatibility with the maximum number of video cards. However, it is possible to force vertex buffer sharing and, if your video card can handle this, improve the performance of your program.
785
FIG-31.53
The SET GLOBAL OBJECT CREATION Statement
SET
GLOBAL
OBJECT
CREATION
mode
In the diagram: mode 0 or 1. 0 - no vertex buffer sharing (this is the default setting); 1 - vertex buffer sharing allowed.
Even if your own video card does allow vertex buffer sharing, your customer's may not, so it's probably best to ignore this option.
Summary
l A point in 3D space is specified using x, y, and z coordinates. l There are three main planes in 3D space - XY, YZ, and XZ. l The computer screen uses a positive-up, negative-down y-axis when operating in 3D mode. This is the opposite from the 2D settings. l The positive z-axis travels away from the viewer "into" the screen. l A point in space is known as a vertex. l A set of vertices, when joined, form a polygon. l The join between two vertices is known as an edge. l Basic 3D shapes are known as primitives. l When first created a 3D object has it centre position at the origin. l The x and y axes intersect at the centre of the screen at start-up. l Use the MAKE OBJECT CUBE to create a cube. l Use MAKE OBJECT BOX to create a cuboid. l Use MAKE OBJECT SPHERE to create a sphere. l The number of polygons used can be specified when creating a sphere. l Use MAKE OBJECT CYLINDER to create a cylinder. l Use MAKE OBJECT CONE to create a cone. l Use MAKE OBJECT PLAIN to create a plane. l A plane is initially oriented as an XY plane. l Use MAKE OBJECT TRIANGLE to create a triangle. l The initial position of a triangle is determined by the vertices given. l Use POSITION OBJECT to place the centre of an object at a new location.
786
l Use MOVE OBJECT to move an object along the x or y axis. l Every 3D object has its own local axes with the origin at the centre of the object. l Use the XROTATE, YROTATE or ZROTATE OBJECT statements to rotate an object to a specific angle about one of its local axes. l Use ROTATE OBJECT to rotate an object to specific angles about all three local axes at the same time. l Use PITCH, TURN or ROLL OBJECT statements to rotate an object by a number of degrees around a given axis. l Use POINT OBJECT to make an object face towards a specified point. l Use MOVE OBJECT distance to move the object a specified number of units in the direction in which an object is pointing. l Use FIX OBJECT PIVOT to reset an object's local axes to be in line with the global axes. l Use SCALE OBJECT to change the dimensions of an object. l Use HIDE OBJECT to make an object invisible. l Use SHOW OBJECT to make an invisible object reappear. l Use DELETE OBJECT to erase an object from RAM. l Use DELETE OBJECTS to erase a group og objects from RAM. l Use CLONE OBJECT to make an independent copy of an existing object. l Use INSTANCE OBJECT to create a dependent copy of an existing object. l Use OBJECT EXIST to check if a specified object exists. l Use OBJECT VISIBLE to check if a specified object is visible. l Use OBJECT POSITION to determine the position in space of an object's centre. l Use OBJECT SIZE to determine the dimensions of a specified object. l Use OBJECT ANGLE to determine the current angle of rotation a specified object has about its local axes. l Use SET OBJECT WIREFRAME to display a 3D object in wireframe or normal mode. l Use SET OBJECT CULL to toggle culling for a specified 3D object. l Use SET GLOBAL OBJECT CREATION to enable/disable vertex buffer sharing.
787
Merging Primitives
Introduction
DarkBASIC Pro version 1.058 introduced statements which allow us to create new shapes by merging two primitives. There are three basic options available: Create the new shape from the combination of the two original shapes - known as union (see FIG-31.54). FIG-31.54
Shape Union
union
Shape 1
Shape 2
Resulting Shape
Create the new shape by removing the overlapping section of shape 2 from shape 1 - known as difference (see FIG-31.55). FIG-31.55
Shape Difference
difference
Shape 1
Shape 2
Resulting Shape
Create the new shape from the overlapping area between shape 1 and shape 2 known as intersection (see FIG-56). FIG-31.56
Shape Intersection
intersection
Shape 1
Shape 2
Resulting Shape
The Statements
When we join two shapes using the merge statements, the resulting shape is stored in a format knows as Constructive Solid Geometry (CSG). We need not concern ourselves with the details of this format, and it is only mentioned here so that you know the meaning of the initials used in the statements.
788
FIG-31.57
The PERFORM CSG UNION Statement
PERFORM
CSG
UNION
objno1
objno2
In the diagram: objno1 is an integer value specifying the ID of the first 3D object to be used in the union. is an integer value specifying the ID of the second 3D object to be used in the union.
objno2
The statement modifies the shape of objno1 without affecting objno2. Normally, the programmer would delete the second object once the union is completed. The program in LISTING-31.13 demonstrates the union of a cube and a box. After the box has been deleted, the resulting shape is then rotated about its local x and y axes. LISTING-31.13
Creating a New 3D Shape using Union REM *** Set screen resolution and background *** SET DISPLAY MODE 1280,1024,32 COLOR BACKDROP 0 BACKDROP ON REM *** Position camera *** AUTOCAM OFF POSITION CAMERA 0,0,-100 REM *** Create two shapes used *** MAKE OBJECT CUBE 1,40 MAKE OBJECT BOX 2,10,30,10 POSITION OBJECT 2,0,15,0 REM *** Let viewer see position of shapes *** WAIT KEY REM *** Union shapes *** PERFORM CSG UNION 1,2 REM *** Remove object 2 *** DELETE OBJECT 2 REM *** Rotate new shape *** DO TURN OBJECT LEFT 1,1.0 PITCH OBJECT UP 1,1.0 LOOP REM *** End program *** END
This program positions the camera which is responsible for the picture we see on the screen. Full details of camera usage are covered in Chapter 33.
Activity 31.28 Type in and test the program given in LISTING-31.13 (object3D16.dbpro). Try changing the second object to a sphere of diameter 10 and change the POSITION OBJECT statement to read
POSITION OBJECT 2, 0, 25, 0
789
As you've just discovered, the UNION statement only works predictably with cubes and boxes. Other shapes give unpredictable results (although the cone is close).
PERFORM
CSG
DIFFERENCE
objno1
objno2
In the diagram: objno1 is an integer value specifying the ID of the first 3D object to be used in the difference operation. is an integer value specifying the ID of the second 3D object to be used in the difference operation.
objno2
As before, the second object is unaffected by the operation and would normally be deleted. Also, we are again restricted to cubes and boxes if we are to obtain consistent results. Activity 31.29 Restore your last project to its original code (as shown in LISTING-31.13). Change the union operation to a difference operation and observe the new shape created. Modify the width and depth of the box to be 35.
PERFORM
CSG
INTERSECTION
objno1
objno2
In the diagram: objno1 is an integer value specifying the ID of the first 3D object to be used in the intersection operation. is an integer value specifying the ID of the second 3D object to be used in the intersection operation.
objno2
Again, the second object would normally be deleted and we are restricted to cubes and boxes if we are to obtain predictable results.
790
Activity 31.30 Modify your previous program and determine how the shape created by the PERFORM CSG INTERSECTION differs from that produced by PERFORM CSG DIFFERENCE.
Summary
l Cubes and boxes can be merged to create new shapes. l Use PERFORM CSG UNION to modify a shape so that it becomes the amalgamation of the original two shapes. l Use PERFORM CSG DIFFERENCE to modify a shape so that the volume it shares with a second shape is removed. l Use PERFORM CSG INTERSECTION to modify a shape to remove polygons which touch the second shape.
791
Solutions
Activity 31.1
No solution required.
Activity 31.5
REM *** Set display & backdrop *** SET DISPLAY MODE 1280,1024,32 COLOR BACKDROP 0 BACKDROP ON REM *** Make the set of objects *** MAKE OBJECT CUBE 1,4 MAKE OBJECT BOX 2,10,15,5 MAKE OBJECT SPHERE 3,7 MAKE OBJECT CYLINDER 4,12 MAKE OBJECT CONE 5,12 REM *** Cube to (9,0,0) after key press *** WAIT KEY POSITION OBJECT 1,9,0,0 REM *** Box to (-60,0,100) *** WAIT KEY POSITION OBJECT 2,-60,0,100 REM *** Sphere to (-30,-40,50) *** WAIT KEY POSITION OBJECT 3,-30,-40,50 REM *** Cylinder to (25,0,120) *** WAIT KEY POSITION OBJECT 4,25,0,120 REM *** Cone to (0,25,100) *** WAIT KEY POSITION OBJECT 5,0,25,100 REM *** End program *** WAIT KEY END
Activity 31.2
1. REM *** Set display and backdrop *** SET DISPLAY MODE 1280,1024,32 COLOR BACKDROP 0 BACKDROP ON REM *** Make the sphere *** MAKE OBJECT SPHERE 1,10 REM *** End program *** WAIT KEY END 2. REM *** Set display and backdrop *** SET DISPLAY MODE 1280,1024,32 COLOR BACKDROP 0 BACKDROP ON REM *** Make the sphere *** MAKE OBJECT SPHERE 1,10,40,40 REM *** End program *** WAIT KEY END
Activity 31.3
1. REM *** Set display and backdrop *** SET DISPLAY MODE 1280,1024,32 COLOR BACKDROP 0 BACKDROP ON REM *** Make the cylinder *** MAKE OBJECT CYLINDER 1,5 REM *** End program *** WAIT KEY END 2. REM *** Set display and backdrop *** SET DISPLAY MODE 1280,1024,32 COLOR BACKDROP 0 BACKDROP ON REM *** Make the cone *** MAKE OBJECT CONE 1,5 REM *** End program *** WAIT KEY END
Activity 31.6
REM *** Set display & backdrop *** SET DISPLAY MODE 1280,1024,32 COLOR BACKDROP 0 BACKDROP ON REM *** Make the set of objects *** MAKE OBJECT CUBE 1,10 REM *** Cube to(9,0,100) after key press *** WAIT KEY POSITION OBJECT 1,9,0,100 REM *** Cube 31.3 units to the right *** WAIT KEY MOVE OBJECT RIGHT 1, 31.3 REM *** End program *** WAIT KEY END
Activity 31.4
REM *** Set display & backdrop *** SET DISPLAY MODE 1280,1024,32 COLOR BACKDROP 0 BACKDROP ON REM *** Make the cube *** MAKE OBJECT CUBE 1, 10 REM *** Cube to (50,0,0) after key press *** WAIT KEY POSITION OBJECT 1,9,0,0 REM *** Move the cube backwards *** WAIT KEY POSITION OBJECT 1, 9,0,30 REM *** End program *** WAIT KEY END
Activity 31.7
Version 1
REM *** Set display & backdrop SET DISPLAY MODE 1280,1024,32 COLOR BACKDROP 0 BACKDROP ON REM *** Make the set of objects *** MAKE OBJECT CUBE 1,40 REM ***Cube to(0,0,100) after key press *** POSITION OBJECT 1,0,0,100 REM *** Rotate cube *** FOR degree = 1 TO 360 XROTATE OBJECT 1, degree WAIT 1 NEXT degree REM *** End program *** WAIT KEY END
792
Version 2
REM *** Set display & backdrop *** SET DISPLAY MODE 1280,1024,32 COLOR BACKDROP 0 BACKDROP ON REM *** Make the set of objects *** MAKE OBJECT CUBE 1,40 REM ***Cube to(0,0,100) after key press *** POSITION OBJECT 1,0,0,100 REM *** Rotate cube *** FOR degree = 359 TO 0 STEP -1 XROTATE OBJECT 1, degree WAIT 1 NEXT degree REM *** End program *** WAIT KEY END
REM *** Set screen resolution *** SET DISPLAY MODE 1280,1024,32 REM *** Create and position cube *** MAKE OBJECT CUBE 1, 40 POSITION OBJECT 1, 0, 0, 200 REM *** Revolve the cube *** FOR c = 1 TO 360 ROLL OBJECT LEFT 1, 1.0 WAIT 10 NEXT c REM *** End program *** WAIT KEY END
Activity 31.13
REM *** Set display & backdrop *** SET DISPLAY MODE 1280,1024,32 COLOR BACKDROP 0 BACKDROP ON REM *** Make the set of objects *** MAKE OBJECT CUBE 1,40 REM ***Cube to(0,0,100) after key press *** WAIT KEY POSITION OBJECT 1,0,0,100 REM *** point cube at (-20,17,-10)*** WAIT KEY POINT OBJECT 1,-20,17,-10 REM *** End program *** WAIT KEY END
Activity 31.8
No solution required.
Activity 31.9
REM ** Set display mode *** SET DISPLAY MODE 1280,1024,32 REM *** Create and position cube *** MAKE OBJECT CUBE 1, 40 POSITION OBJECT 1, 0, 0, 200 REM *** Rotate cube 1 degree at a time *** REM *** around all three axes *** FOR angle = 1 TO 360 ROTATE OBJECT 1, angle,angle,angle WAIT 10 NEXT angle REM *** End program *** WAIT KEY END
Activity 31.14
The changes should cause the cube should move in the direction it is pointing.
No solution required.
Activity 31.16
The cube rotates in the same direction on both occasions.
Activity 31.17
REM *** Set display resolution *** SET DISPLAY MODE 1280,1024,32 REM *** Make and position the cone *** MAKE OBJECT CONE 1, 20 POSITION OBJECT 1, 0,0,200 REM *** Resize cone *** SCALE OBJECT 1, 200.0,100.0,50.0 REM *** Rotate shape *** DO TURN OBJECT RIGHT 1, 1.0 LOOP REM *** End program *** END
Activity 31.11
REM *** Set screen resolution *** SET DISPLAY MODE 1280,1024,32 REM *** Create and position cube *** MAKE OBJECT CUBE 1, 40 POSITION OBJECT 1, 0, 0, 200 REM *** Revolve the cube *** FOR c = 1 TO 360 TURN OBJECT RIGHT 1, 1.0 WAIT 10 NEXT c REM *** End program *** WAIT KEY END
Activity 31.18
No solution required.
Activity 31.19
The second cube is created with the same rotation. The copied cube does not disappear when the original is deleted.
Activity 31.12
793
Activity 31.20
The duplicated cube is not rotated, but it is removed when the original cube is deleted. When the second cube is deleted, the first cube is unaffected.
POSITION OBJECT 2, -25,0,100 DO x3D = MOUSEX() - SCREEN WIDTH()/2 y3D = -(MOUSEY() - SCREEN HEIGHT()/2) POINT OBJECT 1, x3D,y3D,0 POINT OBJECT 2, x3D,y3D,0 LOOP REM *** End program *** END
Activity 31.21
REM *** Set display resolution *** SET DISPLAY MODE 1280,1024,32 REM *** Seed random number generator *** RANDOMIZE TIMER() REM *** Make and position the box *** MAKE OBJECT BOX 1, RND(45)+5,RND(45)+5, RND(45)+5 POSITION OBJECT 1, 0,0,0 REM *** Get dimensions of box *** width# = OBJECT SIZE X(1) height# = OBJECT SIZE Y(1) depth# = OBJECT SIZE Z(1) REM *** Display dimensions *** DO SET CURSOR 10,20 PRINT "Width : ",width#, " Height :", height#, " Depth : ",depth# LOOP REM *** End program *** WAIT KEY END
Activity 31.24
No solution required.
Activity 31.25
REM *** Set screen mode *** SET DISPLAY MODE 1280,1024,32 REM *** Make and position cube *** MAKE OBJECT CUBE 1, 40 POSITION OBJECT 1,25,0,100 REM *** Start in solid and culling on *** wire = 0 cull = 1 REM *** Rotate cube *** DO REM *** IF key pressed, switch mode *** IF INKEY$() ="w" wire = 1 - wire SET OBJECT WIREFRAME 1, wire ENDIF IF INKEY$()="c" cull = 1 - cull SET OBJECT CULL 1,cull ENDIF PITCH OBJECT DOWN 1, 1.0 TURN OBJECT LEFT 1, 1.0 LOOP REM *** End program *** END
Activity 31.22
REM *** Set display resolution *** SET DISPLAY MODE 1280,1024,32 REM *** Seed random number generator *** RANDOMIZE TIMER() REM *** Make and position the box *** MAKE OBJECT BOX 1, RND(45)+5,RND(45)+5, RND(45)+5 POSITION OBJECT 1, 0,0,0 REM *** Rotate box at random *** ROTATE OBJECT 1,RND(359),RND(359),RND(359) REM *** Get dimensions of box *** width# = OBJECT SIZE X(1) height# = OBJECT SIZE Y(1) depth# = OBJECT SIZE Z(1) REM *** Get rotations of box *** x_axis_rotation = OBJECT ANGLE X(1) y_axis_rotation = OBJECT ANGLE Y(1) z_axis_rotation = OBJECT ANGLE Z(1) REM *** Display details *** DO SET CURSOR 10,20 PRINT "Width : ",width#, " Height : " , height#, " Depth : ",depth# SET CURSOR 10,40 PRINT "X-axis : ",x_axis_rotation, " y-axis : ",y_axis_rotation, " z-axis : ", z_axis_rotation LOOP REM *** End program *** WAIT KEY END
Activity 31.26
The inside surfaces of both shapes are not drawn.
Activity 31.27
REM *** Set screen mode *** SET DISPLAY MODE 1280,1024,32 REM *** Make & position cone and cylinder *** MAKE OBJECT CONE 1, 5 POSITION OBJECT 1,-6,-5,0 XROTATE OBJECT 1, 45 MAKE OBJECT CYLINDER 2,5 POSITION OBJECT 2, 6,-5,0 REM ** Culling off for both objects *** SET OBJECT CULL 1,0 SET OBJECT CULL 2,0 REM *** End program *** WAIT KEY END
Activity 31.23
REM *** Set display resolution *** SET DISPLAY MODE 1280,1024,32 REM *** Make and position spheres *** MAKE OBJECT SPHERE 1, 40 POSITION OBJECT 1,25,0,100 MAKE OBJECT SPHERE 2, 40
Activity 31.28
In fact, the UNION operation only works predictably with cubes and boxes.
794
Activity 31.29
REM *** Set screen resolution and background *** SET DISPLAY MODE 1280,1024,32 COLOR BACKDROP 0 BACKDROP ON REM *** Position camera *** AUTOCAM OFF POSITION CAMERA 0,0,-100 REM *** Create two shapes used *** MAKE OBJECT CUBE 1,40 MAKE OBJECT BOX 2,10,30,10 POSITION OBJECT 2,0,15,0 REM *** Let viewer see position of shapes *** WAIT KEY REM *** Difference shapes *** PERFORM CSG DIFFERENCE 1,2 REM *** Remove object 2 *** DELETE OBJECT 2 REM *** Rotate new shape *** DO TURN OBJECT LEFT 1,1.0 PITCH OBJECT UP 1,1.0 LOOP REM *** End program *** END
Activity 31.30
REM *** Set screen resolution and background *** SET DISPLAY MODE 1280,1024,32 COLOR BACKDROP 0 BACKDROP ON REM *** Position camera *** AUTOCAM OFF POSITION CAMERA 0,0,-100 REM *** Create two shapes used *** MAKE OBJECT CUBE 1,40 MAKE OBJECT BOX 2,10,30,10 POSITION OBJECT 2,0,15,0 REM *** Let viewer see position of shapes *** WAIT KEY REM *** Intersection shapes *** PERFORM CSG INTERSETION 1,2 REM *** Remove object 2 *** DELETE OBJECT 2 REM *** Rotate new shape *** DO TURN OBJECT LEFT 1,1.0 PITCH OBJECT UP 1,1.0 LOOP REM *** End program *** END
795
796
32
Applying a Texture Image to a 3D Object Colouring a 3D Object Loading a Texture Image Mipmaps Offsetting a Texture Overlaying Textures Seamless Tiling Semi-Transparent 3D Object Sky Spheres Texture Mapping Options Texture Transparency Tiling Video Texturing
797
Adding Texture
Introduction
The 3D shapes we have created so far look rather bland in white and shades of grey. To make things more interesting we can wrap an image around a 3D shape and thereby enhance its visual impact. This is known as adding texture to the 3D object. An example of a textured cube is shown in FIG-32.1. FIG-32.1
A Textured Cube
After this has been done, we can transfer the image to the surface of one or more 3D objects.
TEXTURE
OBJECT
objno
imgno
In the diagram: objno is an integer value specifying the object to which the texture is to be applied. is an integer value specifying the image to be used as the texture. DarkBASIC Pro: Texturing
imgno
798
The program in LISTING-32.1 demonstrates how a cube can be textured with a wood image to create the impression of a wooden crate. LISTING-32.1
Adding Texture to an Object REM *** Set display resolution *** SET DISPLAY MODE 1280,1024,32 REM *** Load texture image *** LOAD IMAGE "textureWood.jpg",1 REM *** Create cube *** MAKE OBJECT CUBE 1,40 REM *** Add texture to cube *** TEXTURE OBJECT 1,1 REM *** Position cube *** POSITION OBJECT 1,25,0,100 REM *** Rotate cube continuously *** DO TURN OBJECT LEFT 1, 1.0 LOOP REM *** End program *** END
Activity 32.1 Type in and test the program in LISTING-32.1 (texture01.dbpro). Change the texture image to eyecol.bmp. We can see quite clearly from the results of the last Activity that the image is applied separately to each face of the cube. For other shapes, the image may be applied differently. Activity 32.2 Modify your last program so that eyecol.bmp is applied as a texture to a box, cylinder, cone and sphere (any dimensions will do). Create a separate program for each shape. How often is the image repeated on each of the shapes?
Mipmaps
Texturing a 3D object can be quite time consuming. It may be easy enough to map a 300 by 300 pixel image onto a flat surface which occupies exactly 300 by 300 pixels on the screen, but if the 3D object moves off into the distance, the computer has to work much harder to map the same 300 by 300 image onto an object which now occupies just 23 by 23 pixels on the screen. To help with this problem DarkBASIC Pro creates more than one copy of any image that is loaded, with each copy being exactly half the size of the last (see FIG-32.3). DarkBASIC Pro: Texturing 799
FIG-32.3
An Image with Added Mipmaps
As a textured 3D object becomes smaller on the screen, the version of the image used to texture that object changes from the the largest to the smallest. The program in LISTING-32.2 demonstrates this effect. LISTING-32.2
Mipmaps in Action REM *** Set display resolution *** SET DISPLAY MODE 1280,1024,32 REM *** Load texture image *** LOAD IMAGE "eyecol.bmp",1 REM *** Make cube *** MAKE OBJECT CUBE 1,40 TEXTURE OBJECT 1,1 POSITION OBJECT 1,25,0,100 REM *** Move cube away from viewer *** DO POSITION OBJECT 1,25,0,OBJECT POSITION Z(1)+10 LOOP REM *** End program *** END
Activity 32.3 Type in and test the program in LISTING-32.2 (texture02.dbpro). The effect is a fairly subtle one. Look closely at the image on the cube as it moves away from your viewpoint. You should see it become less distinct as it gets smaller.
LOAD
IMAGE
filename
imgno
tflag
In the diagram: filename is a string specifying the name of the file to be loaded.
800
imgno
is an integer specifying the ID to be allocated to the image object being created. is an integer value specifying how the image is to be stored. 0 - mipmaps are created 1 - no mipmaps are created 2 - loads the image in as a cubemap texture (see the chapter on shaders)
tflag
When an image is loaded without mipmaps, any object using that image as a texture must continue to use the original image even when the 3D object is greatly reduced in size on the screen. Activity 32.4 Modify your last program so that no mipmaps are used. To do this change the LOAD IMAGE line to read:
LOAD IMAGE "eyecol.bmp",1,1
How does the texture on the cube differ in this program from the earlier version?
Tiling
In the next example we'll create the floor of a dungeon by texturing a plane using a cobblestone image. The program uses the following logic:
Load cobblestone image Create large plane Rotate plane to be horizontal Texture plane using the cobblestone image
801
The screen dump in FIG-32.5 highlights the problem with the floor - the image has stretched over the whole plane giving a floor that contains only a few unrealistically large blocks rather than hundreds of smaller ones. FIG-32.5
Floor Texturing
One way to solve the problem would be to use an image which actually shows the hundreds of blocks that we need to create a realistic floor. However, this may not be possible and the image would certainly have to be large if the visuals are to look convincing as a character moves over the floor. A second option is to make the texture image repeat itself several times over the surface of the plane. This, for rather obvious reasons, is known as tiling.
(0,1)
(1,1)
When mapped to a flat plane, the image spreads itself over the object with point (0,0) of the image mapping to the top-left corner of the plane and point (1,1) to the bottom-right corner (see FIG-32.7). FIG-32.7
The Default Mapping of an Image to a Plane
(1,1) (0,0) Texture Image
Plane
802
Using the SCALE OBJECT TEXTURE statement, we can adjust this mapping making only a part of the image stretch over the whole object, or have the image duplicate itself several times creating a tiled effect as shown in FIG-32.8. FIG-32.8
The Effects of Using SCALE OBJECT TEXTURE
The SCALE OBJECT TEXTURE statement has the format shown in FIG-32.9. FIG-32.9
The SCALE OBJECT TEXTURE Statement
SCALE
OBJECT
TEXTURE
objno
Uscale
Vscale
In the diagram: objno is an integer value specifying the object to which the texture scaling is to be applied. is a real number specifying the multiplication factor along the U axis. Values less than 1 will result in only part of the image being used. Values greater than 1 will result in duplication of the image over the 3D object. is a real number specifying the multiplication factor along the V axis. Values less than 1 will result in only part of the image being used. Values greater than 1 will result in duplication of the image over the 3D object.
Uscale
Vscale
The first example shown in FIG-32.8 was created using the line:
SCALE OBJECT TEXTURE 1, 0.5, 0.5
The program in LISTING-32.4 demonstrates the effect of texture scaling by applying cobblestones texture repeated 10 times in each direction to the plane. LISTING-32.4
Changing the Texture's Scaling REM *** Set display resolution *** SET DISPLAY MODE 1280,1024,32 REM *** Load texture image *** LOAD IMAGE "stonetile3.jpg",1 REM *** Create and position plain *** MAKE OBJECT PLAIN 1, 400,400 XROTATE OBJECT 1, -90 REM *** Texture plain *** TEXTURE OBJECT 1,1 REM *** Scale texture *** SCALE OBJECT TEXTURE 1,10.0,10.0 REM *** End program *** WAIT KEY END
803
Activity 32.6 Type in and test the program given in LISTING-32.4 (texture04.dbpro). Modify the scaling factors to each of the following settings and observe the results: Uscale 5.0 2.0 0.5 5.0 1.0 Vscale 5.0 2.0 0.5 1.0 5.0
Change the 3D object used in your program from a plane to a sphere and retry each of the settings given above. Scaling a texture image in this way affects the image itself, so there is no way to return to the original image settings within a program.
Seamless Tiling
For tiling to be convincing, the ends of the repeating image must butt together without too obvious a join. If we start with a simple picture and use it as a tiled texture (as shown in FIG-32.10) we get a disappointing effect in which the edge of each image tile is very obvious. FIG-32.10
A Visible Join Between Tiles
To avoid this, we need to modify the image using a paint package such as Paint Shop Pro or Photoshop. The stages involved are shown in FIG-32.11.
804
FIG-32.11
Creating an Image for Seamless Tiling
The main image has been toned down to emphasise the selected area
Load the original image into the Select a section of the image paint program. along the whole of the left edge.
Copy selected area, mirror it, and move it to the right edge.
Of course, it is equally possible to copy the right edge area to the left side and the top to the bottom. You should choose whatever combinations suit the image in question.
Erase parts of the copy to make it merge with the main image.
It takes a bit of practice to achieve good results when creating a texture image, but the results can be worth it. Even when an image is not tiled, we can still have a problem with seams. For example, when the image eyecol.bmp is applied as a texture to a sphere, the join between the left and right edges of the image is quite apparent at the back of the sphere, while the top and bottom edges are squeezed into single points at the two "poles". Activity 32.7 Attempt to modify eyecol.bmp (creating a new file named seamlesseye.bmp) to give a seamless effect when textured onto a sphere. Write a short program (act3207.dbpro) which applies the new file to a sphere and then rotates the sphere continuously about its local y-axis.
Video Texture
It is even possible to use a video clip as a surface texture. To do this we need to start by loading up a video with an instruction such as:
LOAD ANIMATION "mv1.mpg",1
805
FIG-32.12
The PLAY ANIMATION TO IMAGE Statement
PLAY
ANIMATION
TO
IMAGE
varea
imgno
x1
y1
x2
y2
In the diagram: varea is an integer value specifying the video that is to be copied to an image area. is an integer specifying the image area to which the video is to be copied. are the coordinates for the top-left and bottom right space which the video is to occupy.
imgno
x1,y1,x2,y2
The size of the play area (as set by x1, y1, x2, y2) affects the quality of the image when it appears on the 3D object; use too small a set of values and the video will be heavily pixellated; use too large a set of values and displaying the video will put too great a load on the processor/video card and slow the whole thing down. Once the video has been transferred to the image object, we can then use the image to texture a 3D object in the usual manner. LISTING-32.5 demonstrates the effect by placing a video on a rotating cube. LISTING-32.5
Using a Video as a Texture REM *** Set display resolution *** SET DISPLAY MODE 1280,1024,32 REM *** Load video *** LOAD ANIMATION "lion.mpg",1 REM *** Transfer video to image *** PLAY ANIMATION TO IMAGE 1,1,0,0,200,200 REM *** Create cube and texture with video *** MAKE OBJECT CUBE 1,40 TEXTURE OBJECT 1,1 REM *** Move cube away from viewer *** POSITION OBJECT 1,0,0,100 REM *** Rotate cube *** DO TURN OBJECT LEFT 1,1.0 PITCH OBJECT DOWN 1,1.0 LOOP REM *** End program *** END
Activity 32.8 Type in and test the program given in LISTING-32.5 (texture05.dbpro). Modify the program to use very low values for the bottom right corner of the video (i.e. 10,10) and very high values (i.e. 1000,1000). What affect do these changes have on the final result?
806
SET
OBJECT
TEXTURE
objno
tmode
mflag
In the diagram: objno is an integer value specifying the object whose texture is to be modified. is an integer value (1,2,3,4) which directly affects how the tiled texture is applied to the object. 1 - normal tiling. 2 - images are mirrored/flipped so that identical edges meet. 3 - The last pixel along each edge is extended over the remainder of the surface. 4 - The image appears only once. The remainder of the surface is black. Determines if mipmapping is to be used. 0 - mipmapping used 1 - no mipmapping
tmode
mflag
In FIG-32.14 we see the effects of each possible value for tmode when applying eyecol.bmp as a tiled (2 by 2) texture on a cube. FIG-32.14
The Effects of Using Different tmode Settings
The program in LISTING-32.6 shows a tile textured cube with the tmode value of the SET OBJECT TEXTURE statement set to 2. LISTING-32.6
Using the SET OBJECT TEXTURE Statement REM *** Set display resolution *** SET DISPLAY MODE 1280,1024,32 REM *** Load image *** LOAD IMAGE "eyecol.bmp",1 REM *** Create a plain *** MAKE OBJECT PLAIN 1,200,200
LISTING-32.6
(continued) Using the SET OBJECT TEXTURE Statement
REM *** Texture object *** TEXTURE OBJECT 1,1 SCALE OBJECT TEXTURE 1,2,2 REM *** Modify tile mapping *** SET OBJECT TEXTURE 1,4,0 REM *** End program *** WAIT KEY END
Activity 32.9 Type in and test the program in LISTING-32.6 (texture06.dbpro). Try other settings for tmode and check the effects produced.
SCROLL
OBJECT
TEXTURE
objno
Uoffset
Voffset
In the diagram: objno is an integer value specifying the object whose texture is to be scrolled. are a pair of real values representing the coordinates of the image that are to be the top-left corner of the texture when placed on a 3D object.
Uoffset,Voffset
Examples of this statement in use are shown in FIG-32.16 where eyecol.bmp is mapped to a plane object with various Uoffset, Voffset values. FIG-32.16
The Effects of the SCROLL OBJECT TEXTURE Statement
808
LISTING 32.7
Using the SCROLL OBJECT TEXTURE Statement
REM *** Set display resolution *** SET DISPLAY MODE 1280,1024,32 REM *** Load image *** LOAD IMAGE "eyecol.bmp",1 REM *** Create and texture plane object *** MAKE OBJECT PLAIN 1,200,200 TEXTURE OBJECT 1,1 REM *** Offset the texture placed on the image*** SCROLL OBJECT TEXTURE 1,0.1,0.0 REM *** End program *** WAIT KEY END
Activity 32.10 Type in and test the program in LISTING-32.7 (texture07.dbpro). The effect makes a permanent change to the texture for that image, so repeating the same statement creates a further offset. Activity 32.11 In your last program, add another SCROLL OBJECT TEXTURE statement immediately after the first using the same values. How does this affect the texture? By placing the SCROLL OBJECT TEXTURE statement in a loop, the texture can scroll over the surface of the 3D object. Activity 32.12 Remove the second SCROLL OBJECT TEXTURE statement from your last program and insert the remaining SCROLL OBJECT TEXTURE statement in a DO..LOOP structure. What affect does this have on the 3D object's texture? Modify the SCROLL OBJECT TEXTURE statement so that the texture scrolls horizontally rather than vertically. Activity 32.13 In Chapter 31 you created a program in which two spheres followed the movement of the mouse pointer (object3D11.dbpro). Modify that program so that the spheres are textured using seamlesseye.bmp. Add the appropriate SCROLL OBJECT TEXTURE statements so that the pupils of the eyes face the mouse pointer.
809
When an image containing black is mapped to a sprite, any black areas in the image are automatically transparent when the sprite appears on the screen. However, this is not the case with 3D objects. To demonstrate this, the next program (see LISTING-32.8) uses the image shown in FIG-32.17 as the texture on a rotating cube.
FIG-32.17
Image used to Texture a Cube
LISTING-32.8
Black Textured Areas are not Transparent on a 3D Object
REM *** Set display resolution *** SET DISPLAY MODE 1280,1024,32 REM *** Load texture image *** LOAD IMAGE "DoNot.bmp",2 REM *** Make and position cube *** MAKE OBJECT CUBE 1, 40 POSITION OBJECT 1,25,0,100 REM *** Texture cube with image *** TEXTURE OBJECT 1,2 REM *** Rotate cube *** DO PITCH OBJECT DOWN 1, 1.0 TURN OBJECT LEFT 1, 1.0 LOOP REM *** End program *** END
Activity 32.14 Type in and test the program given in LISTING-32.8 (texture08.dbpro). However, we can force a 3D object to make black (or whatever other colour as been set as the background colour using the SET COLOR KEY statement) transparent using the SET OBJECT TRANSPARENCY statement which has the format shown in FIG-32.18. FIG-32.18
The SET OBJECT TRANSPARENCY
SET
OBJECT
TRANSPARENCY
objno
transflag
In the diagram: objno is an integer value specifying the object whose background texture colour is to be made transparent.
810
transflag
immediately before the DO..LOOP structure. How does this affect the appearance of the cube.
Image 1
Image 2
FIG-32.20
The Two Images Applied to a Cube
Notice that any black areas in image 2 are automatically transparent. A second image is applied to the texture of an object using the SET DETAIL MAPPING ON statement which has the format shown in FIG-32.21. FIG-32.21
The SET DETAIL MAPPING ON Statement
SET
DETAIL
MAPPING
ON
objno
imgno
In the diagram: objno is an integer value specifying the object to which a second texture image is to be added. 811
imgno
is an integer value specifying the image object containing the picture to be used as a second texture.
LISTING-32.9 creates the rotating cube shown above. The main lines of code are
LOAD IMAGE "DoNot.bmp",2
Activity 32.16 Type in and test the program given in LISTING-32.9 (texture09.dbpro). Replace DoNot.bmp with DoNotMag.bmp which contains black text on a magenta background. Set magenta as the transparent colour using the SET IMAGE COLORKEY statement. We are limited to a single image when overlaying an object's texture with detail. So, attempting to add a second detail image will simply remove the first from the object. Activity 32.17 Add FlagMag.bmp as a second detail image to the cube object in your last program. What effect does this create? If an object's texture has been tiled using the SCALE OBJECT TEXTURE statement, any additional image added using SET DETAIL MAPPING ON will also be tiled to the same extent as the original texture. 812 DarkBASIC Pro: Texturing
Activity 32.18 In your last program, remove all references to the flagmag.bmp file. Create a tiled effect on the cube by using the SCALE OBJECT TEXTURE statement with the Uscale and Vscale parameters both set to 2. How is the DETAIL MAPPING image on the cube affected by the tiling?
SET
OBJECT
FILTER
objno
filterflag
In the diagram: objno is an integer value specifying the object whose texture is to be filtered. is 0, 1, or 2 0 - always uses the original image to texture (it never uses the smaller images created by mipmapping). 1 - no smoothing is used. 2 - uses linear filtering.
filterflag
The program in LISTING-32.10 creates 3 spheres, each textured using one of the filter options. You may see a slight difference in the appearance of the spheres as they move off into the background and reduce in size. LISTING-32.10
Using the SET OBJECT FILTER Statement REM *** Set screen resolution *** SET DISPLAY MODE 1280,1024,32 REM *** Load image used as texture *** LOAD IMAGE "grid8by8.bmp",1,1 REM *** Create three spheres *** MAKE OBJECT SPHERE 1 ,40 MAKE OBJECT SPHERE 2 ,40 MAKE OBJECT SPHERE 3 ,40 REM *** TEXTURE TEXTURE TEXTURE REM SET SET SET Texture each sphere *** OBJECT 1,1 OBJECT 2,1 OBJECT 3,1
*** Set different filter for each sphere *** OBJECT FILTER 1, 0 OBJECT FILTER 2, 1 OBJECT FILTER 3, 2
REM *** Position spheres *** POSITION OBJECT 1,-42,0,0 POSITION OBJECT 2,0,0,0 POSITION OBJECT 3,42,0,0
813
LISTING-32.10
(continued) Using the SET OBJECT FILTER Statement
REM *** Moves spheres *** FOR z = 1 TO 4000 MOVE OBJECT 1,1 MOVE OBJECT 2,1 MOVE OBJECT 3,1 WAIT 10 NEXT z REM *** End program *** WAIT KEY END
Activity 32.19 Type in and test the program given above (texture10.dbpro).
Summary
l Texturing involves mapping an image onto the surface of a 3D object. l Use LOAD IMAGE to load any image which is to be used to texture a 3D object. l Use TEXTURE OBJECT to map an image to an object. l Images stretch automatically to fit the surface of an object. l On a cube or box the image is repeated on each face. l On other 3D objects, the image appears only once. l Mipmaps are smaller versions of the original image which are used to speed up mapping when a textured object becomes much smaller than the original image. l Tiling is the application of an image multiple times to the same surface. l Use SCALE OBJECT TEXTURE to create a tiled texture. l To create a seamless tile, make sure the opposite edges are complementary. l Use PLAY ANIMATION TO IMAGE and TEXTURE OBJECT to display a video on the surface of an object. l Use SET OBJECT TEXTURE to specify how an image is mapped to a surface. l Use SCROLL OBJECT TEXTURE to create an offset mapping of the image on a 3D surface. l Use SET OBJECT TRANSPARENCY to make black areas of a 3D object disappear. l Use SET DETAIL MAPPING ON to apply a second image to an already textured object. l Use SET OBJECT FILTER to modify how an image is filtered when being mapped onto an object.
814
COLOR
OBJECT
objno
colour
In the diagram: objno is an integer value specifying the object which is to be coloured. is an integer value specifying the colour to be used on the object's surface.
colour
For example, we could give object 1 a red surface using the line:
COLOR OBJECT 1, RGB(255,0,0)
An example of this statement in operation is given in LISTING-32.11 which colours a rotating cube in red, changing to green when a random event occurs. LISTING-32.11
Using COLOR OBJECT REM *** Set display resolution *** SET DISPLAY MODE 1280,1024,32 REM *** Seed random number generator *** RANDOMIZE TIMER() REM *** Make and position cube *** MAKE OBJECT CUBE 1, 40 POSITION OBJECT 1,25,0,100 REM *** Colour cube red *** COLOR OBJECT 1, RGB(255,0,0) REM *** Rotate Cube *** DO PITCH OBJECT DOWN 1, 1.0 TURN OBJECT LEFT 1, 1.0 REM *** One chance in 1000 of changing to green *** IF RND(1000) = 500 COLOR OBJECT 1, RGB(0,255,0) ENDIF LOOP REM *** End program *** END
815
Activity 32.20 Type in and test the program given in LISTING-32.11 (texture11.dbpro). A coloured surface cannot be used in conjunction with a main texture, but secondary textures (created using SET DETAIL MAPPING ON) may still be used. Activity 32.21 Modify your last program so that DoNot.bmp is used as a secondary texture on the surface of the cube.
We can create this effect using the GHOST OBJECT ON statement which has the format shown in FIG-32.25. FIG-32.25
The GHOST OBJECT ON Statement
GHOST
OBJECT
ON
objno
ghostflag
In the diagram: objno is an integer value specifying the 3D object to be made semi-transparent. is 0 to 5. 0 1 2 3 4 5 -
ghostflag
object is semi-transparent object uses negative transparency object is semi-transparent but lighter uses the image's alpha channel similar to 1 but lighter object is opaque
The program in LISTING-32.12 demonstrates the effect of this instruction by rotating the cube with a textured plane in the background.
816
LISTING-32.12
Using the GHOST OBJECT ON Statement
REM *** Set display resolution *** SET DISPLAY MODE 1280,1024,32 REM *** Load texture images *** LOAD IMAGE "grid8by8.bmp",1 LOAD IMAGE "DoNot.bmp",2 REM *** Make and position cube *** MAKE OBJECT CUBE 1, 40 POSITION OBJECT 1,25,0,100 REM *** Texture cube *** TEXTURE OBJECT 1,1 REM *** Create background plane *** MAKE OBJECT PLAIN 2,100,100 TEXTURE OBJECT 2, 2 POSITION OBJECT 2,0,0,200 REM *** Create semi-transparent cube *** GHOST OBJECT ON 1,0 REM *** Rotate cube *** DO PITCH OBJECT DOWN 1, 1.0 TURN OBJECT LEFT 1, 1.0 LOOP REM *** End program *** END
Activity 32.22 Type in and test the program given in LISTING-32.12 (texture12.dbpro). Modify the transflag value in the GHOST OBJECT ON statement and observe the effects of the various settings.
GHOST
OBJECT
OFF
objno
In the diagram: objno is an integer value specifying the 3D object in which the semi-transparency mode is switched off.
817
FIG-32.27
The FADE OBJECT Statement
FADE
OBJECT
objno
value
In the diagram: objno is an integer value specifying the 3D object whose reflective index is to be changed. is an integer value between 0 and 200. A value of zero means that the object will reflect no light; a value of 100 creates normal amount of reflected light; a value of 200 gives twice the normal amount of reflected light.
value
The program in LISTING-32.13 demonstrates the effect of this statement by gradually reducing the reflective value from 200 to zero. LISTING-32.13
Using FADE OBJECT to make a Transparent Object Disappear REM *** Set display resolution *** SET DISPLAY MODE 1280,1024,32 REM *** Load texture images *** LOAD IMAGE "textureWood.jpg",1 LOAD IMAGE "DoNot.bmp",2 REM *** Make and position cube *** MAKE OBJECT CUBE 1, 40 POSITION OBJECT 1,25,0,100 REM *** Texture cube *** TEXTURE OBJECT 1,1 REM *** Create background plain *** MAKE OBJECT PLAIN 2,100,100 TEXTURE OBJECT 2, 2 POSITION OBJECT 2,0,0,200 REM *** Start reflective value at 200 *** reflectivity = 200 REM *** rotate cube *** DO PITCH OBJECT DOWN 1, 1.0 TURN OBJECT LEFT 1, 1.0 FADE OBJECT 1,reflectivity REM *** Decrement reflective value until it reaches zero *** IF reflectivity > 0 DEC reflectivity ENDIF WAIT 10 LOOP REM *** End program *** END
Activity 32.23 Type in and test the program given in LISTING-32.13 (texture13.dbpro). When used in combination with the GHOST OBJECT ON statement, the FADE OBJECT statement can make a semi-transparent object disappear completely.
818
immediately before the DO..LOOP structure. How does this affect the cube? There's still more to be said about texturing objects but we'll leave that to a later chapter after we've covered other basic concepts such as cameras and lighting.
Summary
l Use COLOR OBJECT to tint the surface of a 3D object. l Use GHOST OBJECT ON to make an object transparent. l Use GHOST OBJECT OFF to make a transparent object opaque. l Use FADE OBJECT to reduce the amount of light reflected by an object. l When used on a transparent object, FADE OBJECT can make that object invisible. l When used on an opaque object, FADE OBJECT can make that object completely black.
819
Image
Alpha Channel
We've already seen that the SET OBJECT TRANSPARENCY statement affects the black area of an texture image, but the statement also controls how an alpha channel within an image affects the final texture. The program in LISTING 32-14 textures as cube using windmillshaped.tga. With the default settings, the alpha channel within the image has no effect on the texturing of the cube, but after a SET OBJECT TRANSPARENCY statement is used to modify the texturing, the alpha channel changes the final look of the cube. LISTING-32.14
Texturing with Alpha-Channel Images REM *** Set display resolution *** SET DISPLAY MODE 1280, 1024,32 REM *** Create cube *** MAKE OBJECT CUBE 1,10 REM *** Texture cube *** LOAD IMAGE "windmillshaped.tga",1 TEXTURE OBJECT 1,1 REM *** Rotate cube *** DO REM *** IF key pressed, use alpha channel *** IF INKEY$() <> "" SET OBJECT TRANSPARENCY 1,1 ENDIF TURN OBJECT LEFT 1,1 LOOP REM *** End program *** END
820
Notice that the other parts of the image do not disappear completely when the alpha channel is activated. This is because the darkened areas of the alpha channel are grey and not black. If black had been used, all other parts of the image would have become invisible. An image with an alpha channel also produces an effect when option 3 is used with the GHOST OBJECT ON statement. Activity 32.26 In your last program, change the line
SET OBJECT TRANSPARENCY 1,1
to
GHOST OBJECT ON 1,3
Summary
l Use SET OBJECT TRANSPARENCY with an alpha channel image to create transparent or semitransparent texturing effects. l Use GHOST OBJECT ON with option 3 to make use of the alpha channel information in creating the final ghosting effect.
821
Next, we need to create a more traditional drawing showing the characteristics of the castle (see FIG-32.30). We might also draw specific parts in more detail.
822
FIG-32.30
A More Detailed Design of the Castle
Filename Object
: :
: :
Filename Object
: :
grass1.jpg lawn
Filename Object
: :
Filename Object
: :
Filename Object
: :
Filename Object
: :
The Code
LISTING-32.15
Drawing the Castle REM *** Building Components *** REM *** Texture Images *** #CONSTANT grass 1 #CONSTANT road 2 #CONSTANT tree 3 #CONSTANT flooring 4 #CONSTANT wall 5 #CONSTANT roofing 6 #CONSTANT cover 8 #CONSTANT trellis 9 #CONSTANT transport 10 REM *** 3D Objects *** #CONSTANT lawn 1 #CONSTANT approach 2 #CONSTANT floor1 3 #CONSTANT ceiling 5 #CONSTANT tree1 7 #CONSTANT frontwall 51 #CONSTANT backwall 52 #CONSTANT leftwall 53 #CONSTANT rightwall 54 #CONSTANT innerwall 55 #CONSTANT turret1 56 #CONSTANT turretroof1 57 #CONSTANT turret2 58 #CONSTANT turretroof2 59 #CONSTANT turret3 60 #CONSTANT turretroof3 61 #CONSTANT turret4 62 #CONSTANT turretroof4 63 #CONSTANT roof1 64 #CONSTANT column 70
REM *** Set screen resolution *** SET DISPLAY MODE 1280,1024,32 DrawCastle() WAIT KEY END
FUNCTION LoadImages() REM *** Load texture images *** LOAD IMAGE "grass1.jpg",lawn LOAD IMAGE "CobbleStones.jpg",road LOAD IMAGE "tree.jpg",tree LOAD IMAGE "rock2.jpg",flooring LOAD IMAGE "stone.jpg",wall LOAD IMAGE "tiles.jpg",roofing LOAD IMAGE "ceil_U3_01.jpg",cover ENDFUNCTION
824
LISTING-32.15
(continued) Drawing the Castle
FUNCTION DrawGrounds() REM *** Create lawn *** MAKE OBJECT PLAIN lawn, 500,700 TEXTURE OBJECT lawn, grass SCALE OBJECT TEXTURE lawn, 100,100 XROTATE OBJECT lawn,-90 POSITION OBJECT lawn,250,0,350 SET DETAIL MAPPING ON lawn,transport REM *** Create approach road *** MAKE OBJECT PLAIN approach, 50,700 TEXTURE OBJECT approach,road SCALE OBJECT TEXTURE approach,8,50 XROTATE OBJECT approach,-90 POSITION OBJECT approach, -25,0,350 REM *** Create castle floor *** MAKE OBJECT PLAIN floor1, 550,300 TEXTURE OBJECT floor1, flooring SCALE OBJECT TEXTURE floor1,100,100 XROTATE OBJECT floor1,-90 POSITION OBJECT floor1,225,0,850 DrawTrees() ENDFUNCTION FUNCTION DrawExternalWalls() REM *** Create front wall *** MAKE OBJECT PLAIN frontwall,550,100 TEXTURE OBJECT frontwall,wall SCALE OBJECT TEXTURE frontwall,30,6 POSITION OBJECT frontwall, 225,50,700 REM *** Create back wall *** MAKE OBJECT PLAIN backwall,550,100 TEXTURE OBJECT backwall,wall SCALE OBJECT TEXTURE backwall,50,10 POSITION OBJECT backwall, 225,50,1000 REM *** Create left wall *** MAKE OBJECT PLAIN leftwall,300,100 TEXTURE OBJECT leftwall,wall SCALE OBJECT TEXTURE leftwall,30,10 YROTATE OBJECT leftwall, -90 POSITION OBJECT leftwall,-50,50,850 REM *** Create right wall *** MAKE OBJECT PLAIN rightwall,300,100 TEXTURE OBJECT rightwall,wall SCALE OBJECT TEXTURE rightwall,30,10 YROTATE OBJECT rightwall,90 POSITION OBJECT rightwall,500,50,850 ENDFUNCTION FUNCTION DrawTurrets() REM *** Create first turret *** MAKE OBJECT CYLINDER turret1,200 SCALE OBJECT turret1,40,100,40 MAKE OBJECT CONE turretroof1,81 REM *** Texture turret *** TEXTURE OBJECT turret1,wall SCALE OBJECT TEXTURE turret1,10,10 TEXTURE OBJECT turretroof1,roofing SCALE OBJECT TEXTURE turretroof1,5,10 REM *** Position turret *** POSITION OBJECT turret1, -25,100,970 POSITION OBJECT turretroof1,-25,240,970
825
LISTING-32.15
(continued) Drawing the Castle
REM *** Second turret *** MAKE OBJECT CYLINDER turret2,200 SCALE OBJECT turret2,40,100,40 MAKE OBJECT CONE turretroof2,81 REM *** Texture turret *** TEXTURE OBJECT turret2,wall SCALE OBJECT TEXTURE turret2,10,10 TEXTURE OBJECT turretroof2,roofing SCALE OBJECT TEXTURE turretroof2,5,10 REM *** Position turret *** POSITION OBJECT turret2, 475,100,970 POSITION OBJECT turretroof2,475,240,970 REM *** Third turret *** MAKE OBJECT CYLINDER turret3,200 SCALE OBJECT turret3,40,100,40 MAKE OBJECT CONE turretroof3,81 REM *** Texture turret *** TEXTURE OBJECT turret3,wall SCALE OBJECT TEXTURE turret3,10,10 TEXTURE OBJECT turretroof3,roofing SCALE OBJECT TEXTURE turretroof3,5,10 REM *** Position turret *** POSITION OBJECT turret3, -25,100,725 POSITION OBJECT turretroof3,-25,240,725 REM *** Fourth turret *** MAKE OBJECT CYLINDER turret4,200 SCALE OBJECT turret4,40,100,40 MAKE OBJECT CONE turretroof4,81 REM *** Texture turret *** TEXTURE OBJECT turret4,wall SCALE OBJECT TEXTURE turret4,10,10 TEXTURE OBJECT turretroof4,roofing SCALE OBJECT TEXTURE turretroof4,5,10 REM *** Position turret *** POSITION OBJECT turret4, 475,100,725 POSITION OBJECT turretroof4,475,240,725 ENDFUNCTION FUNCTION DrawRoofAndCeiling() REM *** Create main roof *** MAKE OBJECT PLAIN roof1,550,300 REM *** Texture main roof *** TEXTURE OBJECT roof1,roofing SCALE OBJECT TEXTURE roof1,50,10 REM *** Position roof *** XROTATE OBJECT roof1, -90 POSITION OBJECT roof1,225,100,850 REM *** Create ceiling *** MAKE OBJECT PLAIN ceiling,550,300 REM *** Texture ceiling *** TEXTURE OBJECT ceiling,cover SCALE OBJECT TEXTURE ceiling,5,2 REM *** Position ceiling *** XROTATE OBJECT ceiling, -90 POSITION OBJECT ceiling,225,99,850 ENDFUNCTION FUNCTION DrawInternalColumns() RANDOMIZE TIMER() FOR col = column TO column + 80 MAKE OBJECT BOX col,20,99.8,20 TEXTURE OBJECT col,wall SCALE OBJECT TEXTURE col,5,30 POSITION OBJECT col,RND(515)-20,49.95, RND(270)+710 NEXT col ENDFUNCTION
826
LISTING-32.15
(continued) Drawing the Castle
FUNCTION DrawTrees() REM *** Create trees *** FOR c = tree1 TO tree1 + 30 MAKE OBJECT PLAIN c,25,35 TEXTURE OBJECT c, tree SET OBJECT TRANSPARENCY c,1 POSITION OBJECT c,-45,17,(c-6) * 17.5 NEXT c ENDFUNCTION
The function DrawInternalColumns() adds randomly placed columns within the castle. This will allow our player to have obstacles to navigate without having to go to a great deal of trouble designing an exact layout for the castle's interior. The DrawTrees() function draws a set of trees by texturing a set of planes with a tree image. Activity 32.27 Type in and test the program given above (castle01.dbpro). Activity 32.28 Remove the main section from the program, leaving only the constants and functions. Save this as castle.dbpro. Activity 32.29 Create a program (gallows.dbpro) containing a function, DrawGallows(), that produces a 3D gallows similar to that in the sketch below. Use any appropriate textures.
The gallows platform should be centred on (-125,7.5,0) and be 15 units high, and 50 units in width and depth. Place the gallows on a 300 by 300 cobbled plane. In the main section of the program include the lines
POSITION CAMERA 0,8,-100 POINT CAMERA -150,10,0
after the call to the DrawGallows() function. This will ensure that the camera is pointing at the gallows.
827
Sky Spheres
Both the castle and the gallows look a bit out of place with the blue background. One way to create a more natural environment is to place a large sphere round the whole thing and texture that sphere with an image of the sky. This is known as a sky sphere. FIG-32.32 shows the results obtained by adding a sky sphere to the gallows program. FIG-32.32
Using a Sky Sphere
To implement a sky sphere in our gallows program, we'll start by making the ground plane set up in DrawGallows() a bit larger
MAKE OBJECT PLAIN GroundObj,2000,2000
and then increase the tiling so the cobbles don't get too large:
SCALE OBJECT TEXTURE GroundObj,150,150
These are the only changes required in the DrawGallows() function. Now we can add a few lines to the main section. First we need the image to be used to texture the sphere with a sky effect:
LOAD IMAGE "sky.jpg",1
Next we can create the sphere with the same diameter as the plane:
MAKE OBJECT SPHERE 1,-2000,50,50
Notice that the sphere has been created with extra polygons. This helps smooth out the sky background. Apparently all we need to do now is texture the sphere:
TEXTURE OBJECT 1,1
828
Activity 32.30 Modify your gallows.dbpro program using the lines given above. The main section should be coded as:
REM *** Set up screen *** SET DISPLAY MODE 1280,1024,32 DrawGallows() REM *** Create the sky sphere *** LOAD IMAGE "sky.jpg",1 MAKE OBJECT SPHERE 1,2000,50,50 TEXTURE OBJECT 1,1 REM *** Set up camera *** POSITION CAMERA 0,8,-100 POINT CAMERA -150,10,0 REM *** End program *** WAIT KEY END
Don't worry if you don't see any sky! We can't see the texture on the sphere because we're on the inside of the sphere and DarkBASIC Pro has culled the polygons that make up the sphere. There are two ways to solve this problem. The first is to switch off culling on the sphere. This can be done using the line:
SET OBJECT CULL 1,0
Activity 32.31 Add the above line to the main section of your code. Is the sky now visible? An alternative way of displaying the sphere's texture is to turn the sphere inside out! This is done by specifying a negative size for the sphere when it is being created. Activity 32.32 Change the line
MAKE OBJECT SPHERE 1,2000,50,50
and remove the SET OBJECT CULL statement. How does this affect the sphere's texture?
829
To cure the problem of an inverted mirror image (which isn't actually a problem in this case) we need to save the original image as an inverted mirror image in the first place and this will then be reversed when the image is used as a texture. Activity 32.33 If you have an appropriate paint package, invert and mirror the image sky.jpg (save the resulting image as skyIM.jpg) and use the new image as a texture for the sky sphere. If you don't have an appropriate package, the inverted mirror image is supplied with the images for this chapter.
Summary
l A sky sphere allows us to create a sky affect around our 3D world. l A sky sphere is a large sphere textured with an image of the sky. l To make the sphere's texture visible from within the sphere, switch off the sphere's culling or create and inverted mirror image of the sky and use it to texture a sphere with a negative diameter value.
830
Solutions
Activity 32.1
REM *** Set display resolution *** SET DISPLAY MODE 1280,1024,32 REM *** Load texture image *** LOAD IMAGE "eyecol.bmp",1 REM *** Create cube *** MAKE OBJECT CUBE 1, 40 REM *** Add texture to cube *** TEXTURE OBJECT 1,1 REM *** Position cube *** POSITION OBJECT 1,25,0,100 REM *** Rotate cube continuously *** DO TURN OBJECT LEFT 1, 1.0 LOOP REM *** End program *** END
Activity 32.8
By changing the coordinates of the bottom right corner of the video to 10,10, the video itself is only 11 pixels by 11 pixels, and, when expanded to cover the surface of the cube becomes indistinct and blocky. By changing the corner values from 10,10 to 1000,1000 we make the video 1001 pixels by 1001 pixels (actually larger than the original recording). Since we cannot add any detail which was not in the original recording, this size does not achieve any better results than a lower resolution (say 640 by 640), but does increase the load on the video hardware and slows down the whole process.
Activity 32.9
No solution required.
Activity 32.2
To change shape requires the line
MAKE OBJECT CUBE 1,40
Activity 32.10
No solution required.
Activity 32.11
REM *** Set display resolution *** SET DISPLAY MODE 1280,1024,32 REM *** Load image *** LOAD IMAGE "eyecol.bmp",1 REM *** Create and texture plain object *** MAKE OBJECT PLAIN 1,200,200 TEXTURE OBJECT 1,1 REM *** Offset texture on image*** SCROLL OBJECT TEXTURE 1,0.1,0.0 WAIT KEY SCROLL OBJECT TEXTURE 1,0.1,0.0 REM *** End program *** WAIT KEY END
The cube and box repeat the texture image on each side; other shapes show the image only once.
Activity 32.3
No solution required.
Activity 32.4
The texture seems a little more blurred when using mipmaps, but the texturing process seems to be carried out at a faster frame rate.
We can see from the results produced by the program that the scroll effect is cumulative, with the image moving another step to the left when the second SCROLL OBJECT TEXTURE statement is applied.
Activity 32.5
No solution required.
Activity 32.12
REM *** Set display resolution *** SET DISPLAY MODE 1280,1024,32 REM *** Load image *** LOAD IMAGE "eyecol.bmp",1 REM *** Create and texture plain object *** MAKE OBJECT PLAIN 1,200,200 TEXTURE OBJECT 1,1 REM *** Offset texture placed on image*** DO SCROLL OBJECT TEXTURE 1,0.1,0.0 LOOP REM *** End program *** WAIT KEY END
Activity 32.6
No solution required.
Activity 32.7
REM *** Set display resolution *** SET DISPLAY MODE 1280,1024,32 REM *** Load texture image *** LOAD IMAGE "seamlesseye.bmp",1 REM *** Create and texture sphere *** MAKE OBJECT SPHERE 1, 40,40,40 TEXTURE OBJECT 1,1 DO TURN OBJECT LEFT 1, 1.0 LOOP END
831
REM *** Create and texture plain object *** MAKE OBJECT PLAIN 1,200,200 TEXTURE OBJECT 1,1 REM *** Offset texture placed on image*** DO SCROLL OBJECT TEXTURE 1,0.0,0.1 LOOP REM *** End program *** WAIT KEY END
LOAD IMAGE "textureWood.jpg",1 LOAD IMAGE "DoNotMag.bmp",2 REM *** Create and texture cube *** MAKE OBJECT CUBE 1, 40 TEXTURE OBJECT 1,1 REM *** Add secondary texture *** SET DETAIL MAPPING ON 1,2 REM *** Position cube *** POSITION OBJECT 1,25,0,100 REM *** Rotate cube *** DO PITCH OBJECT DOWN 1, 1.0 TURN OBJECT LEFT 1, 1.0 LOOP REM *** End program *** END
Activity 32.13
REM *** Set display resolution *** SET DISPLAY MODE 1280,1024,32 REM *** Make and position spheres *** LOAD IMAGE "eyecol.bmp",1 MAKE OBJECT SPHERE 1, 40 POSITION OBJECT 1,25,-20,100 MAKE OBJECT SPHERE 2, 40 POSITION OBJECT 2, -25,-20,100 REM *** Texture spheres *** TEXTURE OBJECT 1,1 TEXTURE OBJECT 2,1 REM *** Offset so eyes are at front *** SCROLL OBJECT TEXTURE 1, 0.51,0.0 SCROLL OBJECT TEXTURE 2,0.51,0.0 REM *** Make eyes follow mouse *** DO x3D = MOUSEX() - SCREEN WIDTH()/2 y3D = -(MOUSEY() - SCREEN HEIGHT()/2) POINT OBJECT 1, x3D,y3D,-300 POINT OBJECT 2, x3D,y3D,-300 LOOP REM *** End program *** WAIT KEY END
Activity 32.17
REM *** Set display resolution *** SET DISPLAY MODE 1280,1024,32 REM *** Set magenta as transparent *** SET IMAGE COLORKEY 255,0,255 REM *** Load texture images *** LOAD IMAGE "textureWood.jpg",1 LOAD IMAGE "DoNotMag.bmp",2 LOAD IMAGE "FlagMag.bmp",3 REM *** Create and texture cube *** MAKE OBJECT CUBE 1, 40 TEXTURE OBJECT 1,1 REM *** Add text as secondary texture *** SET DETAIL MAPPING ON 1,2 REM *** Try using another texture *** SET DETAIL MAPPING ON 1,3 REM *** Position cube *** POSITION OBJECT 1,25,0,100 REM *** Rotate cube *** DO PITCH OBJECT DOWN 1, 1.0 TURN OBJECT LEFT 1, 1.0 LOOP REM *** End program *** END
Activity 32.14
No solution required.
Activity 32.15
REM *** Set display resolution *** SET DISPLAY MODE 1280,1024,32 REM *** Load texture image *** LOAD IMAGE "DoNot.bmp",2 REM *** Make and position cube *** MAKE OBJECT CUBE 1, 40 POSITION OBJECT 1,25,0,100 REM *** Texture cube with image *** TEXTURE OBJECT 1,2 REM *** Make black areas of texture *** REM *** transparent *** SET OBJECT TRANSPARENCY 1,1 REM *** Rotate cube *** DO PITCH OBJECT DOWN 1, 1.0 TURN OBJECT LEFT 1, 1.0 LOOP REM *** End program *** END
Only the wood and flag textures show; the text "DO NOT OPEN" is missing.
Activity 32.18
REM *** Set display resolution *** SET DISPLAY MODE 1280,1024,32 REM *** Set magenta as transparent *** SET IMAGE COLORKEY 255,0,255 REM *** Load texture images *** LOAD IMAGE "textureWood.jpg",1 LOAD IMAGE "DoNotMag.bmp",2 REM *** Create and texture cube *** MAKE OBJECT CUBE 1, 40 TEXTURE OBJECT 1,1 REM *** Tile cube's texture *** SCALE OBJECT TEXTURE 1,2,2 REM *** Add secondary texture *** SET DETAIL MAPPING ON 1,2 REM *** Position cube *** POSITION OBJECT 1,25,0,100 REM *** Rotate cube *** DO PITCH OBJECT DOWN 1, 1.0 TURN OBJECT LEFT 1, 1.0 LOOP REM *** End program *** END
Activity 32.16
REM SET REM SET REM *** Set display resolution *** DISPLAY MODE 1280,1024,32 *** Make magenta transparent *** IMAGE COLORKEY 255,0,255 *** Load texture images ***
832
Activity 32.19
No solution required.
Activity 32.20
No solution required.
Activity 32.25
No solution required.
Activity 32.21
REM *** Set display resolution *** SET DISPLAY MODE 1280,1024,32 REM *** Seed random number generator *** RANDOMIZE TIMER() REM *** Load image *** LOAD IMAGE "DoNot.bmp",1 REM *** Make and position cube *** MAKE OBJECT CUBE 1, 40 REM *** Create detail mapping *** SET DETAIL MAPPING ON 1,1 POSITION OBJECT 1,25,0,100 REM *** Colour cube red *** COLOR OBJECT 1, RGB(255,0,0) REM *** Rotate Cube *** DO PITCH OBJECT DOWN 1,1.0 TURN OBJECT LEFT 1, 1.0 REM *** 1 in 1000 of going green *** IF RND(1000) = 500 COLOR OBJECT 1, RGB(0,255,0) ENDIF LOOP REM *** End program *** END
Activity 32.26
REM *** Set display resolution *** SET DISPLAY MODE 1280, 1024,32 REM *** Create cube *** MAKE OBJECT CUBE 1,10 REM *** Texture cube *** LOAD IMAGE "windmillshaped.tga",1 TEXTURE OBJECT 1,1 REM *** Rotate cube *** DO REM *** IF key pressed, ghost *** IF INKEY$() <> "" GHOST OBJECT ON 1,3 ENDIF TURN OBJECT LEFT 1,1 LOOP REM *** End program *** END
Activity 32.27
No solution required.
Activity 32.22
No solution required.
Activity 32.28
No solution required.
Activity 32.23
No solution required.
Activity 32.29
REM *** Set display resolution *** SET DISPLAY MODE 1280,1024,32 DrawGallows() POINT CAMERA -150,10,0 WAIT KEY END
Activity 32.24
REM *** Set display resolution *** SET DISPLAY MODE 1280,1024,32 REM *** Load texture images *** LOAD IMAGE "textureWood.jpg",1 LOAD IMAGE "DoNot.bmp",2 REM *** Make and position cube *** MAKE OBJECT CUBE 1, 40 POSITION OBJECT 1,25,0,100 REM *** Texture cube *** TEXTURE OBJECT 1,1 REM *** Create background plain *** MAKE OBJECT PLAIN 2,100,100 TEXTURE OBJECT 2, 2 POSITION OBJECT 2,0,0,200 REM *** Start reflective value at 200 *** reflectivity = 200 REM *** Make cube transparent *** GHOST OBJECT ON 1,0 REM *** rotate cube *** DO PITCH OBJECT DOWN 1, 1.0 TURN OBJECT LEFT 1, 1.0 FADE OBJECT 1,reflectivity REM *** Reduce reflectivity to zero *** IF reflectivity > 0 DEC reflectivity ENDIF
FUNCTION DrawGallows() REM *** Set up names *** REM *** Object names *** #CONSTANT GroundObj 901 #CONSTANT PlatformObj 902 #CONSTANT VerticalPostObj 903 #CONSTANT HorizontalPostObj 904 #CONSTANT DiagonalPostObj 905 #CONSTANT TopStepObj 906 #CONSTANT MiddleStepObj 907 #CONSTANT BottomStepObj 908 #CONSTANT StepEdgeRightObj 909 #CONSTANT StepEdgeLeftObj 910 REM *** Image names *** #CONSTANT CobbleImg 901 #CONSTANT PlanksImg 902 #CONSTANT WoodImg 903 REM *** Load texture images *** LOAD IMAGE "TextureWood.jpg",PlanksImg LOAD IMAGE "CobbleStones.jpg",CobbleImg LOAD IMAGE "Wood.jpg",WoodImg REM *** Create cobbled square *** MAKE OBJECT PLAIN GroundObj,300,300
833
TEXTURE OBJECT GroundObj,CobbleImg SCALE OBJECT TEXTURE GroundObj,30,30 XROTATE OBJECT GroundObj,-90 REM *** Create platform *** MAKE OBJECT BOX PlatformObj,50,15,50 TEXTURE OBJECT PlatformObj,PlanksImg SCALE OBJECT TEXTURE PlatformObj,2,2 POSITION OBJECT PlatformObj,-125,7.5,0 REM *** Create vertical post *** MAKE OBJECT BOX VerticalPostObj,2,30,2 TEXTURE OBJECT VerticalPostObj,WoodImg POSITION OBJECT VerticalPostObj, -147.5,30,0 REM *** Create horizontal post *** MAKE OBJECT BOX HorizontalPostObj, 2,15,2 TEXTURE OBJECT HorizontalPostObj, WoodImg ZROTATE OBJECT HorizontalPostObj,90 POSITION OBJECT HorizontalPostObj, -139,44,0 REM *** Create diagonal post *** MAKE OBJECT BOX DiagonalPostObj,1,10,1 TEXTURE OBJECT DiagonalPostObj,WoodImg ZROTATE OBJECT DiagonalPostObj,-45 POSITION OBJECT DiagonalPostObj, -144,40,0 REM *** Make top step *** MAKE OBJECT BOX TopStepObj,10,0.3,3 TEXTURE OBJECT TopStepObj,WoodImg POSITION OBJECT TopStepObj,-130,12,-26 REM *** Make middle step *** CLONE OBJECT MiddleStepObj,TopStepObj POSITION OBJECT MiddleStepObj,-130,8,-29 REM *** Make bottom step *** CLONE OBJECT BottomStepObj,TopStepObj POSITION OBJECT BottomStepObj,-130,4,-32 REM *** Make right step edge*** MAKE OBJECT BOX StepEdgeRightObj,0.3,4,20 TEXTURE OBJECT StepEdgeRightObj,WoodImg XROTATE OBJECT StepEdgeRightObj,-50 POSITION OBJECT StepEdgeRightObj, -125,6,-30 REM *** Make left step edge *** CLONE OBJECT StepEdgeLeftObj, StepEdgeRightObj POSITION OBJECT StepEdgeLeftObj, -135,6,-30 ENDFUNCTION
Activity 32.30
The changes to the cobbled square in the DrawGallows() function are shown in bold below:
REM *** Create cobbled square *** MAKE OBJECT PLAIN GroundObj,2000,2000 TEXTURE OBJECT GroundObj,CobbleImg SCALE OBJECT TEXTURE GroundObj,150,150
Activity 32.31
The sky should now be visible.
Activity 32.32
The sphere's texture is upside down and mirrored.
Activity 32.33
No solution required.
834