- Home /
How can I transform a primitive using only GL and matrix multiplication (no GameObject)?
Hello, I've been creating simple primitives in Unity using GL (without Gizmos since it needs to be more versatile). The initial drawing of the classes I have implemented (like "line" and "circle") are drawing fine. Here's an example:
class LineAnnotation : Annotation
{
Vector3[] vertices { get; set; }
Color LineColor = new Color(0,0,0,1);
public LineAnnotation(Vector3 start, Vector3 end)
{
vertices = new Vector3[2] {
start,
end
};
if(material == null) {
CreateMaterial();
}
}
public override void Draw()
{
GL.PushMatrix();
if (material != null) {
material.SetPass(0);
}
GL.Begin(GL.LINES);
GL.Color(new Color(0,0,0));
GL.Vertex(vertices[0]);
GL.Vertex(vertices[1]);
GL.End();
GL.PopMatrix();
}
}
However, I also have "Transform" classes which need to translate, rotate, or scale a given primitive. The problem is that the transforms are not happening. The primitives get drawn in their initial positions, even when they're inside of a Transform object that is storing the vector translation. See my code below:
This is the draw method for my translation class, and below that is the one for scaling:
public override void Draw() // The translation one.
{
GL.PushMatrix(); // Save Matrix
GL.modelview.SetTRS(Translation,Quaternion.identity, Vector3.one); // Change Translation, but leave the other parts of the matrix alone.
DrawChildren(); // Draws the primitives it was passed
GL.PopMatrix(); // Restore Matrix
}
public override void Draw() //This is the scaling one.
{
GL.PushMatrix(); // Save Matrix
GL.modelview.SetTRS(Vector3.zero,Quaternion.identity, new Vector3(Scale, Scale, Scale)); // Change Scale part of modelview, but leave the other parts of the matrix alone.
DrawChildren(); // Draws the primitives it was passed
GL.PopMatrix(); // Restore Matrix
}
Does anyone have any ideas about why this is happening? I feel like there's a pretty easy fix to it that I'm missing, but it can't be that hard to transform the modelview matrix so that I can transform whatever child primitive is being drawn, and then pop back out so I can get on with drawing other primitives. Any thoughts or advice is welcome.
why do you use GL in unity? I thought you are talking about some kind of opencompute shader mesh creation, I thought that everything translation etc in unity used the unity commands
@jerichaosymphony - GL is a Unity class implementing a low level graphics library.
http://docs.unity3d.com/Documentation/ScriptReference/GL.html
I was wondering, maybe the problem is line 23, the GL.Begin(GL_LINES)? Is it possible that that resets the modelview matrix regardless of the fact that I pushed the matrix first?
Answer by evajolli · Dec 23, 2014 at 07:13 AM
var matrix = Matrix4x4.TRS(...);
GL.PushMatrix();
GL.MultMatrix(matrix);
//Draw
GL.PopMatrix();
This worked for me.
Your answer
![](https://koobas.hobune.stream/wayback/20220613103225im_/https://answers.unity.com/themes/thub/images/avi.jpg)
Follow this Question
Related Questions
Graphics library 1 Answer
gl class iOS 1 Answer
Using GL to display HUD on screen 0 Answers