public static CCoordObj RotatePoint(CCoordObj point, CCoordObj center, CCoordObj rotation) { var cosa = Math.Cos(CCoordObj.DegreesToRadians(-rotation.xPos)); var sina = Math.Sin(CCoordObj.DegreesToRadians(-rotation.xPos)); var cosb = Math.Cos(CCoordObj.DegreesToRadians(-rotation.yPos)); var sinb = Math.Sin(CCoordObj.DegreesToRadians(-rotation.yPos)); var cosc = Math.Cos(CCoordObj.DegreesToRadians(-rotation.zPos)); var sinc = Math.Sin(CCoordObj.DegreesToRadians(-rotation.zPos)); var Axx = cosa * cosb; var Axy = cosa * sinb * sinc - sina * cosc; var Axz = cosa * sinb * cosc + sina * sinc; var Ayx = sina * cosb; var Ayy = sina * sinb * sinc + cosa * cosc; var Ayz = sina * sinb * cosc - cosa * sinc; var Azx = -sinb; var Azy = cosb * sinc; var Azz = cosb * cosc; var endRot = new CCoordObj(Axx * point.xPos + Axy * point.yPos + Axz * point.zPos, Ayx * point.xPos + Ayy * point.yPos + Ayz * point.zPos, Azx * point.xPos + Azy * point.yPos + Azz * point.zPos); return(endRot); }
//render all verts in a face void RenderFace(Face face) { for (int i = 0; i < face.vertices.Count; i++) { //move object to center before rotating var sPos = face.parentObject.cPos; face.parentObject.cPos = new CCoordObj(0, 0, 0); var pos = face.vertices[i]; var summedPos = new CCoordObj(pos.xPos + face.parentObject.cPos.xPos, pos.yPos + face.parentObject.cPos.yPos, pos.zPos + face.parentObject.cPos.zPos); //rotate vert around object center var rotatedPos = CCoordObj.RotatePoint(summedPos, face.parentObject.cPos, face.parentObject.cRot); RenderPosition((int)Math.Round(rotatedPos.xPos + sPos.xPos), (int)Math.Round(rotatedPos.yPos + sPos.yPos)); //reset object position face.parentObject.cPos = sPos; } }
//create new prefab RenderObject Instantiate(string type, CCoordObj position, CCoordObj rotation, CCoordObj scale) { if (type == "plane") { var o = new RenderObject(); var f = new Face(); f.vertices.Add(new CCoordObj(-scale.xPos, -scale.yPos, scale.zPos)); f.vertices.Add(new CCoordObj(-scale.xPos, scale.yPos, scale.zPos)); f.vertices.Add(new CCoordObj(scale.xPos, scale.yPos, scale.zPos)); f.vertices.Add(new CCoordObj(scale.xPos, -scale.yPos, scale.zPos)); f.parentObject = o; o.cPos = position; o.cRot = rotation; o.faces.Add(f); return(o); } if (type == "testobj") { //plane with a second smaller plane inside var o = new RenderObject(); var f = new Face(); f.vertices.Add(new CCoordObj(-scale.xPos, -scale.yPos, scale.zPos)); f.vertices.Add(new CCoordObj(0, scale.yPos, scale.zPos)); f.vertices.Add(new CCoordObj(scale.xPos, -scale.yPos, scale.zPos)); f.parentObject = o; o.faces.Add(f); var f2 = new Face(); f2.vertices.Add(new CCoordObj(-scale.xPos * 0.2f, -scale.yPos * 0.2f, scale.zPos)); f2.vertices.Add(new CCoordObj(-scale.xPos * 0.2f, scale.yPos * 0.2f, scale.zPos)); f2.vertices.Add(new CCoordObj(scale.xPos * 0.2f, scale.yPos * 0.2f, scale.zPos)); f2.vertices.Add(new CCoordObj(scale.xPos * 0.2f, -scale.yPos * 0.2f, scale.zPos)); f2.parentObject = o; o.cPos = position; o.cRot = rotation; o.faces.Add(f2); return(o); } else { return(null); } }