Skip to content

Instantly share code, notes, and snippets.

@Bersaelor
Last active September 11, 2020 07:58
Show Gist options
  • Star 4 You must be signed in to star a gist
  • Fork 2 You must be signed in to fork a gist
  • Save Bersaelor/aeb36f4f524dbec6540fb48918e987ec to your computer and use it in GitHub Desktop.
Save Bersaelor/aeb36f4f524dbec6540fb48918e987ec to your computer and use it in GitHub Desktop.
Applying SCNMatrix4 to SCNVector3 (Couldn't find this in SceneKit)
//
// Matrix4+Extensions.swift
// StARs
//
// Created by Konrad Feiler on 17.12.17.
// Copyright © 2017 Konrad Feiler. All rights reserved.
//
import Foundation
import SceneKit
extension float4x4 {
init(_ matrix: SCNMatrix4) {
self.init([
float4(matrix.m11, matrix.m12, matrix.m13, matrix.m14),
float4(matrix.m21, matrix.m22, matrix.m23, matrix.m24),
float4(matrix.m31, matrix.m32, matrix.m33, matrix.m34),
float4(matrix.m41, matrix.m42, matrix.m43, matrix.m44)
])
}
}
extension float4 {
init(_ vector: SCNVector4) {
self.init(vector.x, vector.y, vector.z, vector.w)
}
init(_ vector: SCNVector3) {
self.init(vector.x, vector.y, vector.z, 1)
}
}
extension SCNVector4 {
init(_ vector: float4) {
self.init(x: vector.x, y: vector.y, z: vector.z, w: vector.w)
}
init(_ vector: SCNVector3) {
self.init(x: vector.x, y: vector.y, z: vector.z, w: 1)
}
}
extension SCNVector3 {
init(_ vector: float4) {
self.init(x: vector.x / vector.w, y: vector.y / vector.w, z: vector.z / vector.w)
}
}
func * (left: SCNMatrix4, right: SCNVector3) -> SCNVector3 {
let matrix = float4x4(left)
let vector = float4(right)
let result = matrix * vector
return SCNVector3(result)
}
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment