# Difference between revisions of "Asymptote: 3D graphics"

## Three

Three is a module in Asymptote that allows the user to create three dimensional graphics. Usually all you must do is import three, ``` import three; ```

then change from using doubles eg. (x,y) to using triples eg. (x,y,z) as coordinates. Some functions do not work when three is active. For example: To fill a surface, one must define a surface and draw that, instead of using filldraw. This is also described at http://www.artofproblemsolving.com/Forum/viewtopic.php?f=519&t=399845.

### Data types

three defines the data types:

• path3, (3D version of path)
• guide3, (3D version of guide)
• and surface (a surface bounded by a path(3))

and other, less important ones.

### Definitions

three defines the surfaces:

• unitcube
• unitsphere
• unitdisk
• unitplane
• unitcylinder
• unitcone
• unitsolidcone
• and unithemisphere.

These can be drawn like you would normally draw an object in 2D

```draw(unitcube,green);
```

$[asy] import three; draw(shift(2,3,4)*scale(5,20,7)*unitcube,green);[/asy]$ Transforms also work

```draw(shift(2,3,4)*scale(5,20,7)*unitcone,paleblue);
```

$[asy] import three; draw(shift(2,3,4)*scale(5,20,7)*unitcone,paleblue);[/asy]$

## Projection

You can use ``` currentprojection=orthographic(x,y,z); ``` to change the current view. ``` currentprojection=perspective(x,y,z); ``` does the same thing, but it distorts the picture to imitate actual perspective.

Example:

base code:

```import three;
/* perspective line */
draw(unitcube,palegrey);
```

Using ``` currentprojection=orthographic(1,1/2,1/2); ``` We get a unit cube as: $[asy] import three; currentprojection=orthographic(1,1/2,1/2); draw(unitcube,palegrey); [/asy]$ Using ``` currentprojection=perspective(1,1/2,1/2); ``` We get a unit cube as: $[asy] import three; currentprojection=perspective(1,1/2,1/2); draw(unitcube,palegrey); [/asy]$

Note: When current projection is not given, three tries to find the "best" view.

## Interactive Projection

When using Asymptote on your computer (not on AoPS), you can add some code that lets you rotate/pan/zoom with the mouse.

```import settings;
leftbutton=new string[] {"rotate","zoom","shift","pan"};
wheelup=new string[] {"zoomin"};
wheeldown=new string[] {"zoomout"};
```

When compiling to PDF, it will allow you to rotate/pan/zoom with the mouse.

## Arrows and bars

Arrows and bars in 3D are the same as in 2D except you add a 3 to the end of the name. Example.

```import three;
draw((0,0,0)--(1,1,1),green,Arrows3);
draw((0,1,0)--(1,0,1),blue,Bars3);
```

$[asy] import three; draw((0,0,0)--(1,1,1),green,Arrows3); draw((0,1,0)--(1,0,1),blue,Bars3); [/asy]$

## Examples

```import three;
unitsize(1cm);
size(200);
currentprojection=perspective(1/3,-1,1/2);
draw((0,0,0)--(1,0,0)--(1,1,0)--(0,1,0)--cycle,red);
draw((0,0,0)--(0,0,1),red);
draw((0,1,0)--(0,1,1),red);
draw((1,1,0)--(1,1,1),red);
draw((1,0,0)--(1,0,1),red);
draw((0,0,1)--(1,0,1)--(1,1,1)--(0,1,1)--cycle,red);
draw((0,0,0)--(1,0,0)--(1,1,0)--cycle,red);
draw((0,0,0)--(1,1,0)--(1,1,1)--cycle,blue);
label("\$o\$",(0,0,0),NW);
label("\$x=1\$",(0.5,0,0),S);
label("\$y=1\$",(1,1,0.5),E);
label("\$z=1\$",(1,0.5,0),SE);
label("\$c\$",(0.5,0.5,0.5),N);
```

Which renders to $[asy] import three; unitsize(1cm); size(200); currentprojection=orthographic(1/3,-1,1/2); draw((0,0,0)--(1,0,0)--(1,1,0)--(0,1,0)--cycle,red); draw((0,0,0)--(0,0,1),red); draw((0,1,0)--(0,1,1),red); draw((1,1,0)--(1,1,1),red); draw((1,0,0)--(1,0,1),red); draw((0,0,1)--(1,0,1)--(1,1,1)--(0,1,1)--cycle,red); draw((0,0,0)--(1,0,0)--(1,1,0)--cycle,red); draw((0,0,0)--(1,1,0)--(1,1,1)--cycle,blue); label("o",(0,0,0),NW); label("x=1",(0.5,0,0),S); label("y=1",(1,1,0.5),E); label("z=1",(1,0.5,0),SE); label("c",(0.5,0.5,0.5),N);[/asy]$

For other examples, see Platonic solids and 2000 AMC 12 Problems/Problem 25.

## Other 3D Modules

Other modules in Asymptote that are for 3D are:

• graph3
• grid3
• contour3
• and solids.