Difference between revisions of "Shear"

(Created page with "This function was borrowed from way's [https://love2d.org/forums/viewtopic.php?f=5&t=1692&p=16988 3D dice roller demo]. It performs a [https://en.wikipedia.org/wiki/...")
 
(Hint shear parameters in love.graphics.draw)
Line 20: Line 20:
 
end
 
end
 
</source>
 
</source>
 +
 +
'''Note:''' If you just want to shear a single image, you can use the shear parameters in [[love.graphics.draw]] (added in version 0.8.0).
  
 
[[Category:Snippets]]
 
[[Category:Snippets]]

Revision as of 16:45, 23 April 2012

This function was borrowed from way's 3D dice roller demo. It performs a graphics shear (AKA "skew") coordinate transformation (which affects all following draws). It's recommended to perform a love.graphics.push before shearing.

function shear(ox, oy, xx, xy, yx, yy)
	local atan2, acos, tan = math.atan2, math.acos, math.tan
	local ex, ey, fx,fy = xx-ox, xy-oy, yx-ox, yy-oy
	if ex*fy<ey*fx then ex,ey,fx,fy=fx,fy,ex,ey end
	local e,f = (ex*ex+ey*ey)^.5, (fx*fx+fy*fy)^.5
	ex,ey = ex/e, ey/e
	fx,fy = fx/f, fy/f
	local desiredOrientation=atan2(ey+fy,ex+fx)
	local desiredAngle=acos(ex*fx+ey*fy)/2
	local z=tan(desiredAngle)
	local distortion=((1+z*z)/2)^.5
	love.graphics.translate(ox, oy)
	love.graphics.rotate(desiredOrientation)
	love.graphics.scale(1, z)
	love.graphics.rotate(-pi/4)
	love.graphics.scale(e/distortion,f/distortion)
end

Note: If you just want to shear a single image, you can use the shear parameters in love.graphics.draw (added in version 0.8.0).


Other Languages