raytracerNOGLFWtest.py

You can view and download this file on Github: raytracerNOGLFWtest.py

  1# -*- coding: utf-8 -*-
  2#+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
  3# This is an EXUDYN example
  4#
  5# Details:  Create scissor-like chain of bodies and prismatic joints to test functionality
  6#
  7# Author:   Johannes Gerstmayr
  8# Date:     2020-01-14
  9#
 10# Copyright:This file is part of Exudyn. Exudyn is free software. You can redistribute it and/or modify it under the terms of the Exudyn license. See 'LICENSE.txt' for more details.
 11#
 12#+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
 13
 14import exudyn as exu
 15from exudyn.utilities import * #includes itemInterface and rigidBodyUtilities
 16import exudyn.graphics as graphics #only import if it does not conflict
 17
 18useGraphics = True #without test
 19#+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
 20#you can erase the following lines and all exudynTestGlobals related operations if this is not intended to be used as TestModel:
 21try: #only if called from test suite
 22    from modelUnitTests import exudynTestGlobals #for globally storing test results
 23    useGraphics = exudynTestGlobals.useGraphics
 24except:
 25    class ExudynTestGlobals:
 26        pass
 27    exudynTestGlobals = ExudynTestGlobals()
 28#+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
 29useGraphics = False
 30import numpy as np
 31
 32SC = exu.SystemContainer()
 33mbs = SC.AddSystem()
 34
 35gBack = graphics.CheckerBoard(point=[0,0,0], size=10, nTiles=10, normal=[0.,0.,1],
 36                              color=[0.9,0.9,0.9]+[graphics.material.indexChrome],
 37                              alternatingColor=[0.8,0.8,0.8]+[graphics.material.indexChrome],
 38                              addEdges=False)
 39
 40text = '''
 41 !"#$%&'()*+,-./
 420123456789:;<=>?
 43@ABCDEFGHIJKLMNO
 44PQRSTUVWXYZ[\\]^_
 45`abcdefghijklmno
 46pqrstuvwxyz{|}~
 47ΓΔΘΛΞΠΣΦΨΩαβγδεζ
 48ηθικλμνξοπρστυφχ
 49ψωϕϵ₀₁₂₃₄₅₆₇₈₉⁰¹
 50²³⁴⁵⁶⁷⁸⁹∂∫♥√≈∞🙂😒
 51ÀÁÂÃÄÅÆÇÈÉÊËÌÍÎÏ
 52ÐÑÒÓÔÕÖרÙÚÛÜÝÞß
 53àáâãäåæçèéêëìíîï
 54ðñòóôõö÷øùúûüýþÿ'''
 55
 56gText = graphics.Text(point=[0,-5,1], text=text, color=[0.2,0.2,0.2,1], fontSize=12)
 57
 58mbs.CreateGround(referencePosition=[0,0,-1], graphicsDataList=[gBack]+[gText]*(1-useGraphics) )
 59
 60gObjectsList = []
 61
 62nMaterials = 10
 63nTiles = 16*2
 64
 65for i in range(nMaterials//2):
 66    i0 = i*2
 67    i1 = i*2+1
 68    color0 = graphics.colorList[i0]
 69    color1 = graphics.colorList[i1]
 70    gBrick = graphics.Brick(size=[0.8,1.25,0.7],
 71                                  color=color0[:3]+[graphics.material.indexDefault+i0],
 72                                  addEdges=True,addNormals=True,
 73                                  )
 74
 75    gSphere = graphics.Sphere(radius=0.8,
 76                              color=color1[:3]+[graphics.material.indexDefault+i1],
 77                              nTiles=nTiles)
 78
 79    gSphere = graphics.Move(gSphere, [0,0,0], np.diag([1.2,0.8,0.8]) )
 80
 81    gObjectsList.append( mbs.CreateGround(referencePosition=[0,0,0],
 82                                          graphicsDataList=[gBrick]) )
 83    gObjectsList.append( mbs.CreateGround(referencePosition=[0,0,0],
 84                                          graphicsDataList=[gSphere]) )
 85
 86#just to simulate something
 87mbs.CreateRigidBody(referencePosition=[3,0.8,1],
 88                    inertia=InertiaCuboid(1000, [2,1.2,1]),
 89                    show=False)
 90
 91mbs.Assemble()
 92
 93import matplotlib.pyplot as plt
 94
 95mbs.variables['imageCounter'] = 0
 96#rotation matrix for view CTRL-7:
 97A=RotationVector2RotationMatrix(52/180*pi*np.array([-0.82,0.25,0.5149]))
 98
 99def PreStepUserFunction(mbs, t):
100    if t > 0:
101        rot = RotationMatrix2RotationVector(A@RotationMatrixZ(0.5*t*0.5*pi))
102        SC.renderer.SetModelView(5.7,rot,[0,0,0])
103        if useGraphics:
104            image = SC.renderer.RedrawAndGetImage(True)
105            imageCounter = mbs.variables['imageCounter']
106            exu.Print(f'image: frame{imageCounter:05}.png:',image.shape)
107            plt.imsave(f"images/frame{imageCounter:05}.png", image)
108            mbs.variables['imageCounter'] += 1
109
110    fact = t if t < 1 else 1
111    #fact = 1
112    for i, obj in enumerate(gObjectsList):
113        offset = 0.2*t*0.5*pi
114        radius = 4*fact
115        phi = offset + i/nMaterials * 2 * pi
116        pos = [radius*sin(phi),radius*cos(phi),1.25]
117        mbs.SetObjectParameter(obj, 'referencePosition', pos)
118        rot = RotXYZ2RotationMatrix([5*phi, 2*phi,0])
119        mbs.SetObjectParameter(obj, 'referenceRotation', rot)
120    return True
121
122mbs.SetPreStepUserFunction(PreStepUserFunction)
123
124#sizeFactor=1, nTiles=128, lightVariations=71, multisampling=1:
125#OLD: approx 0.7s / image
126windowSize = [1200,1000]
127if not useGraphics:
128    windowSize = [400,300] #3
129
130SC.visualizationSettings.view0.window.renderWindowSize = windowSize
131
132SC.visualizationSettings.general.useMultiThreadedRendering = False
133#SC.visualizationSettings.view0.window.showComputationInfo = False
134SC.visualizationSettings.nodes.showNumbers = True
135SC.visualizationSettings.nodes.show = True
136# SC.visualizationSettings.general.textAlwaysInFront = False
137
138
139SC.visualizationSettings.openGL.multiSampling = 2
140SC.visualizationSettings.openGL.light1.enable = False
141SC.visualizationSettings.openGL.light0.position = [0,0,15,1]
142SC.visualizationSettings.openGL.light1.position = [-3,-3,-10,1]
143SC.visualizationSettings.openGL.light1.diffuse = SC.visualizationSettings.openGL.light0.diffuse
144#SC.visualizationSettings.openGL.light1.specular = SC.visualizationSettings.openGL.light0.specular
145SC.visualizationSettings.openGL.light0.shadow = 0.2
146SC.visualizationSettings.raytracer.numberOfThreads = 8+32*useGraphics
147SC.visualizationSettings.openGL.light0.lightRadius = 0.5
148SC.visualizationSettings.raytracer.lightRadiusVariations = 13
149SC.visualizationSettings.raytracer.advanced.shadowSmoothingSteps = 2
150SC.visualizationSettings.raytracer.advanced.shadowScalingFactor = 3
151SC.visualizationSettings.raytracer.verbose = useGraphics+1
152SC.visualizationSettings.raytracer.maxReflectionDepth = 2
153SC.visualizationSettings.raytracer.maxTransparencyDepth = 2
154#SC.visualizationSettings.view0.camera.useRaytracer = True
155SC.visualizationSettings.raytracer.imageSizeFactor = 1
156SC.visualizationSettings.raytracer.keepWindowActive = True
157SC.visualizationSettings.view0.camera.clippingPlaneNormal = [0,1*0,0]
158SC.visualizationSettings.view0.camera.clippingPlaneDistance = 2.
159SC.visualizationSettings.view0.camera.perspective = 1
160
161SC.visualizationSettings.view0.scene.drawCoordinateSystem = 2
162SC.visualizationSettings.general.useGradientBackground = True
163
164
165m = SC.renderer.materials.Get("chrome")
166m.reflectivity = 0.12
167SC.renderer.materials.Set("chrome", m)
168
169if False:
170    import matplotlib.pyplot as plt
171    exu.Print('get image...')
172    SC.renderer.SetState({'displayScaling':1.5})
173    SC.renderer.SetModelView(9,[0,0,1],[1,0,0])
174    image = SC.renderer.RedrawAndGetImage(True)
175    exu.Print('image:',image.shape)
176    plt.imshow(image)
177    plt.show(block=True)
178
179
180tEnd = 4
181stepSize = 2e-2
182simulationSettings = exu.SimulationSettings()
183simulationSettings.solutionSettings.writeSolutionToFile = False
184#simulationSettings.timeIntegration.simulateInRealtime = True
185#simulationSettings.timeIntegration.realtimeFactor = 0.2
186simulationSettings.timeIntegration.numberOfSteps = int(tEnd/stepSize)
187simulationSettings.timeIntegration.endTime = tEnd
188
189if useGraphics:
190    SC.renderer.Start()              #start graphics visualization
191    SC.renderer.SetModelView(5.7,52/180*pi*np.array([-0.82,0.25,0.5149]),[0,0,0])
192
193mbs.SolveDynamic(simulationSettings)
194
195if useGraphics:
196    SC.renderer.DoIdleTasks()
197    SC.renderer.Stop()
198
199if not useGraphics:
200    #this example shows how to retrieve a single image:
201    import matplotlib.pyplot as plt
202
203    exu.Print('get image...')
204    #rotation matrix for view CTRL-7:
205    SC.renderer.SetState({'displayScaling':1.5})
206    SC.renderer.SetModelView(5.7,52/180*pi*np.array([-0.82,0.25,0.5149]),[0,0,0])
207    image = SC.renderer.RedrawAndGetImage(True)[0:int(windowSize[1]*0.9),:,:] #cut out version info!
208    if False: #save image for manual check
209        exu.Print('image:',image.shape, ', save as images/test.jpg')
210        plt.imsave("images/test.jpg", image)
211        plt.imshow(image)
212        plt.show(block=False)
213
214    #compute checksum for image:
215    flat_pixels = image.ravel().astype(np.int64)
216    n = flat_pixels.size
217    counters = np.arange(n, 2*n, dtype=np.int64) #start at n, so pixels are weighted different, but similar
218    checksum = np.sum(flat_pixels * counters)/np.int64(1e14)
219    exu.Print('raytracerNOGLFWtest: image checksum=', checksum)
220
221    exudynTestGlobals.testResult = checksum