[vlc-devel] [PATCH v3 2/8] viewpoint: add euler to 4x4 matrix conversion

Alexandre Janniaux ajanni at videolabs.io
Fri Mar 8 10:35:39 CET 2019


Refactor code from opengl/vout_helper and d3d11, by merging the creation of
three 4x4 rotation matrices for the shaders into only one created from the
viewpoint.
---
 include/vlc_viewpoint.h | 13 ++++++++
 src/Makefile.am         |  3 +-
 src/misc/viewpoint.c    | 71 +++++++++++++++++++++++++++++++++++++++++
 3 files changed, 86 insertions(+), 1 deletion(-)
 create mode 100644 src/misc/viewpoint.c

diff --git a/include/vlc_viewpoint.h b/include/vlc_viewpoint.h
index 7c3f617050..f121e25f17 100644
--- a/include/vlc_viewpoint.h
+++ b/include/vlc_viewpoint.h
@@ -78,4 +78,17 @@ static inline void vlc_viewpoint_reverse( vlc_viewpoint_t *dst,
     dst->fov   = src->fov;
 }
 
+/**
+ * Generate the 4x4 transform matrix corresponding to a viewpoint
+ *
+ * Convert a vlc_viewpoint_t into a 4x4 transform matrix with a column-major
+ * layout.
+ * The transformation is applied as-is. you have to reverse the viewpoint with
+ * \ref vlc_viewpoint_reverse first if you want to transform the world.
+ *
+ * \param vp a valid viewpoint object
+ * \param matrix a 4x4-sized array which will contain the matrix data
+ */
+void vlc_viewpoint_to_4x4( const vlc_viewpoint_t *vp, float *matrix );
+
 #endif /* VLC_VIEWPOINT_H_ */
diff --git a/src/Makefile.am b/src/Makefile.am
index 5f90229486..5e1a448cca 100644
--- a/src/Makefile.am
+++ b/src/Makefile.am
@@ -390,7 +390,8 @@ libvlccore_la_SOURCES = \
 	misc/sort.c \
 	misc/subpicture.c \
 	misc/subpicture.h \
-	misc/medialibrary.c
+	misc/medialibrary.c \
+	misc/viewpoint.c
 libvlccore_la_LIBADD = $(LIBS_libvlccore) \
 	../compat/libcompat.la \
 	$(LTLIBINTL) $(LTLIBICONV) \
diff --git a/src/misc/viewpoint.c b/src/misc/viewpoint.c
new file mode 100644
index 0000000000..b4fb5484af
--- /dev/null
+++ b/src/misc/viewpoint.c
@@ -0,0 +1,71 @@
+/*****************************************************************************
+ * viewpoint.c: viewpoint helpers for conversions and transformations
+ *****************************************************************************
+ * Copyright (C) 2019 VLC authors and VideoLAN
+ *
+ * Authors: Alexandre Janniaux <ajanni at videolabs.io>
+ *
+ * This program is free software; you can redistribute it and/or modify it
+ * under the terms of the GNU Lesser General Public License as published by
+ * the Free Software Foundation; either version 2.1 of the License, or
+ * (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU Lesser General Public License for more details.
+ *
+ * You should have received a copy of the GNU Lesser General Public License
+ * along with this program; if not, write to the Free Software Foundation,
+ * Inc., 51 Franklin Street, Fifth Floor, Boston MA 02110-1301, USA.
+ *****************************************************************************/
+
+#ifdef HAVE_CONFIG_H
+# include "config.h"
+#endif
+
+#include <vlc_viewpoint.h>
+
+void vlc_viewpoint_to_4x4( const vlc_viewpoint_t *vp, float *m )
+{
+    float yaw   = vp->yaw   * (float)M_PI / 180.f + (float)M_PI_2;
+    float pitch = vp->pitch * (float)M_PI / 180.f;
+    float roll  = vp->roll  * (float)M_PI / 180.f;
+
+    float s, c;
+
+    s = sinf(pitch);
+    c = cosf(pitch);
+    const float x_rot[4][4] = {
+        { 1.f,    0.f,    0.f,    0.f },
+        { 0.f,    c,      -s,      0.f },
+        { 0.f,    s,      c,      0.f },
+        { 0.f,    0.f,    0.f,    1.f } };
+
+    s = sinf(yaw);
+    c = cosf(yaw);
+    const float y_rot[4][4] = {
+        { c,      0.f,    s,     0.f },
+        { 0.f,    1.f,    0.f,    0.f },
+        { -s,      0.f,    c,      0.f },
+        { 0.f,    0.f,    0.f,    1.f } };
+
+    s = sinf(roll);
+    c = cosf(roll);
+    const float z_rot[4][4] = {
+        { c,      s,      0.f,    0.f },
+        { -s,     c,      0.f,    0.f },
+        { 0.f,    0.f,    1.f,    0.f },
+        { 0.f,    0.f,    0.f,    1.f } };
+
+    /**
+     * Column-major matrix multiplication mathematically equal to
+     * z_rot * x_rot * y_rot
+     */
+    memset(m, 0, 16 * sizeof(float));
+    for (int i=0; i<4; ++i)
+        for (int j=0; j<4; ++j)
+            for (int k=0; k<4; ++k)
+                for (int l=0; l<4; ++l)
+                    m[4*i+l] += y_rot[i][j] * x_rot[j][k] * z_rot[k][l];
+}
-- 
2.21.0



More information about the vlc-devel mailing list