# Can Makie plots be dimension agnostic?

**URL:** <https://discourse.julialang.org/t/can-makie-plots-be-dimension-agnostic/92124>\
**Category:** General Usage\
**Tags:** makie, geometric-algebra\
**Created:** [December 26, 2022, 5:40am UTC](https://discourse.julialang.org/t/can-makie-plots-be-dimension-agnostic/92124 "2022-12-26T05:40:02Z")\
**Posts on this page:** 1\
**Showing post:** 16

<div class="post-metadata">

**Author:** ![g2g](https://avatars.discourse-cdn.com/v4/letter/g/41988e/32.png) [@g2g](https://discourse.julialang.org/u/g2g)\
**Post date:** [January 23, 2023, 8:42pm UTC](https://discourse.julialang.org/t/can-makie-plots-be-dimension-agnostic/92124/16 "2023-01-23T20:42:01Z")

</div>

> [@jules](#):
>
> maybe we should decide on one behavior.

In my JavaScript to Julia port of a 3D slicer example application, some simple way to orient/scale/offset 3D model axes would have been helpful.

The JavaScript version of the application loads a [Wavefront](https://en.wikipedia.org/wiki/Wavefront_Technologies) 3D object text file that defines all the triangle vertices and the triangle faces of a model of a bunny. As the JavaScript version plots the bunny rotating, it also calculates horizontal cross sections.

The Julia/GLMake/FileIO version of the application load()-ed the bunny object on its side (because that old Wavefront object text file format defined the model with the y-axis as the azimuth but GLMakie apparently expects the z-axis to be the azimuth). I ended up writing the following script to change the azimuth axis, and also change vertex scaling and offsets.

```julia
# xobj.jl
# Transform a wavefront 3D object's 
# - axis orientations (new y = -old z; new z = old y)
# - scale
# - offsets
function xobj(fn="xbunny.obj", scale=13., 
	xOff=0.218413, yOff=-0.01927, zOff=-0.4330287)
	
	# initialize
	iLine = 0
	i1 = 1
	LIM = [Inf -Inf; Inf -Inf; Inf -Inf]
	
	# open output file
	open(fn, "w") do io
	
		# for each line of input file
		for line in eachline(fn[2:end])
			iLine += 1
			
			# if line does not define a vertex
			if line[1] != 'v'
				println(io, line) # copy it
			
			# else line defines a vertex
			else
				nChar = length(line)
				print(io, "v")
				iState = 0
				vTmp = 0.
				i1 = 3
				for iChar = 3:nChar
					if isspace(line[iChar]) || iChar==nChar
						iState += 1
						i2 = iChar==nChar ? iChar : iChar - 1
						v = parse(Float32,line[i1:i2])
						v *= Float32(scale)
						if iState == 1 # x
							v += Float32(xOff)
							print(io, ' ') # prefix space
							print(io, v)
							if LIM[1,1] > v
								LIM[1,1] = v
							end
							if LIM[1,2] < v
								LIM[1,2] = v
							end
						elseif iState == 2 # y
							vTmp = v
						elseif iState == 3 # z
							v = -v + Float32(yOff)
							print(io, ' ') # prefix space
							print(io, v)
							if LIM[2,1] > v
								LIM[2,1] = v
							end
							if LIM[2,2] < v
								LIM[2,2] = v
							end
							
							vTmp += Float32(zOff)
							print(io, ' ') # prefix space
							println(io, vTmp)
							if LIM[3,1] > vTmp
								LIM[3,1] = vTmp
							end
							if LIM[3,2] < vTmp
								LIM[3,2] = vTmp
							end
							break
						end
						i1 = iChar + 1
					end # if character ends a field
				end # for each character
			end # else line defines a vertex
		end # input file
		display(LIM)
	end # output file
end

```

With the modified orientation of axes, GLMakie greatly simplifies this 3D slicer example application by using the azimuth parameter to rotate the object, avoiding the JavaScript application’s approach of implementing a rotor and moving a camera. (When I finally get the Julia version’s projective geometric algebra code to calculate the slices, I’ll post the code [here](https://discourse.julialang.org/t/essay-julia-and-projective-geometric-algebra/92767).)

---

_[View the full topic](https://discourse.julialang.org/t/can-makie-plots-be-dimension-agnostic/92124)._
